Cómo hacer una compuerta NOR bit a bit en Python (editando Python Maths para que funcione para mí)

Di que iba a escribir esto:

a=01100001 b=01100010 c=01100011 d=01100100 e=01100101 

cada letra se asemeja a los números dados ahora, ¿cómo lidiaría con los valores que se parecen?

Python querría hacer esto:

 a + b = 2200011 

pero lo que quiero que haga es esto

  • si 0 y 0 se intentan sumr, muestra 1
  • si se intentan sumr 1 y 0 se muestra 0
  • si 0 y 1 se intentan sumr, muestra 0
  • Si se intentan sumr 1 y 1 se muestra 0

Lo que deseo hacer es a + b = 10011100

¿Hay alguna manera de editar la forma en que Python funciona con las matemáticas en esta instancia?

he dado mucho los valores establecidos para representar las letras, pero lo que quiero hacer es cambiar la forma en que Python me da resultados para que coincida con la puerta XOR en la explicación anterior

así que cualquiera podría dar un ejemplo de un código para dar valores establecidos (1 + 1 = 0) (0 + 0 = 1) … por ejemplo

Tu dijiste:

Lo que deseo hacer es a + b = 10011100

Mi solución:

 >>> a=0b01100001 >>> b=0b01100010 >>> bin((a | b) ^ 0b11111111) '0b10011100' 

Y ahora, por la explicación:

Está solicitando una operación NOR bitwise ( http://en.wikipedia.org/wiki/NOR_gate si no es obvio):

 r = not (a or b) 

Además, puedes usar la ley de De Morgan, que dice que es equivalente a:

 r = (not a) and (not b) 

En Python:

 >>> bin((a ^ 0b11111111) & (b ^ 0b11111111)) '0b10011100' 

También puede preguntarse qué es eso ^ 0b11111111 . Bueno, not a es equivalente a a xor 1 y xor está escrito ^ en python. Le sugiero que escriba la tabla lógica si no está 100% convencido. Básicamente, ^ 0b11111111 cambia de 0 a 1 y de 1 a 0.

La función bin proporciona la representación binaria del número dado como parámetro. El 0b al comienzo de un número significa que el número se da en la base 2 (de lo contrario es la base 10).

Editar:

Inicialmente, mi primer pensamiento para este problema fue:

 bin(~(a|b)) 

Pero el resultado es '-0b1100100' . Esto es porque en Python el número está firmado. Pero también es posible obtener un buen resultado manteniendo solo el primer byte:

 >>> bin(~(a|b) & 0xff) '0b10011100' 

Edición 2:

Acabo de encontrar que OP hizo otra pregunta para comprender mejor mi respuesta. Entonces, si se pregunta por qué usé un XOR para hacer el NO, vea una buena explicación aquí: https://stackoverflow.com/a/19203069/1787973

Usted nos dio la “tabla de verdad” de todas las entradas posibles (gracias por eso). Y dice que la salida debería ser 1 si ambas entradas son 0, de lo contrario, la salida debería ser 0. El nombre de esa operación lógica es NOR, es decir, la negación de OR.

Tenga en cuenta que sus entradas son números de base 10, pero parecen representar números de base 2 o conjuntos de bits. Así que quizás lo primero que deberíamos hacer es convertirlos de su forma de base 10 a base 2. Una forma simple (pero no demasiado eficiente) sería int(str(a), 2) .

A partir de ahí, es solo una cuestión de hacer la operación NOR en los números. Desde aquí: https://wiki.python.org/moin/BitwiseOperators parece que puedes hacer ~(x|y) (negado OR, bitwise).