Python proporciona los siguientes operadores bitwise, que realizan la conjunción lógica, la disyunción lógica, la disyunción exclusiva, la inversión bitwise, el desplazamiento de bits a la izquierda y el desplazamiento de bits a la derecha en cada bit de un valor int de tipo entero binario, respectivamente.
&
|
^
~
<<
>>
En esta sección, primero explicamos lo siguiente.
- intersección (AND) :
&
- disyunción (OR) :
|
- Operación EXCLUSIVA-OR (XOR) :
^
A continuación, hablaremos de lo siguiente.
- Operaciones bit a bit con enteros negativos
- volteo de bits ( NOT) :
~
- cambio de bits :
<<
,>>
Para más información sobre cómo escribir números enteros en binario, octal y hexadecimal, y cómo convertir números binarios, octales y hexadecimales y cadenas utilizando las siguientes funciones, consulte el siguiente artículo.
bin()
oct()
hex()
format()
- Artículos relacionados:Convertir números binarios, octales y hexadecimales y cadenas entre sí en Python
Además, para las operaciones lógicas (operaciones booleanas) sobre valores booleanos (verdadero, falso) en lugar de las operaciones a nivel de bits, consulte el siguiente artículo. Utilice and,or en lugar de &,|.
- Artículos relacionados:Operadores lógicos de Python y, o, y no (conjunción lógica, disyunción, negación)
intersección (AND) : &operador
Este es un ejemplo de un AND lógico usando el operador &, con el resultado convertido a una cadena en notación binaria por bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
disyunción (OR) : |operador
Un ejemplo de producto lógico (OR) utilizando el operador |, con el resultado convertido a una cadena en notación binaria por bin() y salida conjunta.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Operación EXCLUSIVA-OR (XOR) : ^operador
Ejemplo de un producto lógico (XOR) utilizando el operador ^, combinado con el resultado de la conversión a una cadena en notación binaria utilizando bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
La relación entre la entrada y la salida para cada bit de la lógica AND, OR y XOR se muestra en la siguiente tabla.
Entrada 1 | Entrada 2 | intersección (AND) | disyunción (OR) | Operación EXCLUSIVA-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Operaciones bit a bit con enteros negativos
Cuando se realiza una operación a nivel de bits sobre un entero negativo, el valor se procesa como si estuviera expresado en forma de complemento a dos.
Tenga en cuenta, sin embargo, que si convierte un entero negativo a una cadena binaria utilizando bin() o format(), el valor absoluto tendrá un signo menos en lugar de un formato de complemento a dos.
Si desea obtener una cadena con representación en complemento a dos, tome AND con el número máximo de dígitos de bits requerido, como se muestra a continuación.
- Para 4 bits
0b1111
(=0xf
) - Para 8 bits
0xff
- Para 16 bits
0xffff
Puede obtener una cadena de representación en complemento a dos (cada bit se invierte y se añade un 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Artículos relacionados:Convertir números binarios, octales y hexadecimales y cadenas entre sí en Python
volteo de bits : ~operador
~Ejemplo de cambio de bits con operadores.
La inversión bit a bit no es simplemente el valor de cada bit invertido. El valor de retorno al utilizar este operador es el siguiente.~x
=-(x+1)
-(x+1)
Este valor equivale a considerar el valor de entrada x como una forma de complemento a dos e invertir todos los bits.
Como se mencionó anteriormente, en Python, cuando un entero negativo se convierte a una cadena binaria usando bin(), format(), etc., no está en forma de complemento a dos, sino en valor absoluto con un signo menos. Por lo tanto, convertir ~x directamente a una cadena no dará como resultado una cadena con los bits del valor original invertidos.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Cuando realizamos la operación AND y la convertimos en una cadena de representación en complemento a dos, podemos ver que los bits del valor original están invertidos.
Además, por ejemplo, para obtener una cadena de bits que sea una cadena de bits de 4 dígitos invertida tal cual (bit de signo omitido), utilice format() para rellenar los ceros del valor ANDed de la siguiente manera'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
cambio de bits : << , >>
Ejemplos de desplazamiento de bits a la izquierda y a la derecha utilizando operadores de desplazamiento de bits.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
En el caso de los valores negativos, el bit de signo se extiende y se desplaza, y el signo positivo\Nnegativo sigue siendo el mismo. Un valor negativo es una imagen de una línea de 1s hasta la izquierda.
x = -9 print(bin(x)) print(bin(x & 0xff)) # -0b1001 # 0b11110111 print(x << 1) print(bin(x << 1)) print(bin((x << 1) & 0xff)) # -18 # -0b10010 # 0b11101110 print(x >> 1) print(bin(x >> 1)) print(bin((x >> 1) & 0xff)) # -5 # -0b101 # 0b11111011
Es mejor pensar en términos de cadenas de expresiones de complemento a dos, ya que pensar en términos de números no está claro.