¿Cómo hago una operación No bitwise en Python?

Para probar la construcción de una operación Xor con más bloques de construcción básicos (usando Nand, Or y And en mi caso) necesito poder hacer una operación No. El incorporado not solo parece hacer esto con bits individuales. Si lo hago:

 x = 0b1100 x = not x 

Debería obtener 0b0011 pero en lugar de eso solo obtengo 0b0 . ¿Qué estoy haciendo mal? ¿O es Python simplemente falta esta funcionalidad básica?

Sé que Python tiene una función Xor incorporada, pero he estado usando Python para probar cosas para un proyecto / curso HDL donde necesito construir una compuerta Xor. Quería probar esto en Python, pero no puedo sin un equivalente a una puerta No.

El problema con el uso de ~ en Python, es que funciona con enteros con signo. Esta es también la única manera que realmente tiene sentido a menos que se limite a un número particular de bits. Funcionará bien con matemáticas a nivel de bits, pero puede dificultar la interpretación de los resultados intermedios.

Para lógica de 4 bits, solo debes restar de 0b1111

 0b1111 - 0b1100 # == 0b0011 

Para lógica de 8 bits, reste de 0b11111111 etc.

La forma general es

 def bit_not(n, numbits=8): return (1 << numbits) - 1 - n 

Otra forma de lograr esto, es asignar una máscara como esta (debería ser todo 1):

 mask = 0b1111 

Luego exórtalo con tu número como este:

 number = 0b1100 mask = 0b1111 print(bin(number ^ mask)) 

Puede consultar la tabla de verdad de exor para saber por qué funciona.

Intenta esto, se llama el operador de complemento bitwise:

 ~0b1100 

La forma general dada por John La Rooy, se puede simplificar de esta manera (python == 2.7 y> = 3.1):

 def bit_not(n): return (1 << n.bit_length()) - 1 - n