Operadores de bits de Python (producto lógico, OR lógico, OR exclusivo, inversión, desplazamiento)

Negocio

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()

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 &,|.

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 1Entrada 2intersección (AND)disyunción (OR)Operación EXCLUSIVA-OR (XOR)
11110
10011
01011
00000

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 bits0b1111 (=0xf)
  • Para 8 bits0xff
  • Para 16 bits0xffff

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

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.

Copied title and URL