Operadores bit a bit de Python (produto lóxico, OU lóxico, OR exclusivo, inversión, desprazamento)

Negocios

Python proporciona os seguintes operadores bit a bit, que realizan conxunción lóxica, disxunción lóxica, disxunción exclusiva, inversión bit a bit, desprazamento de bit á esquerda e desprazamento de bit á dereita en cada bit dun valor int de tipo enteiro binario, respectivamente.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

Nesta sección, primeiro explicamos o seguinte.

  • intersección(AND) :&
  • disxunción(OR) :|
  • Operación EXCLUSIVA-OR(XOR) :^

A continuación, comentaremos o seguinte.

  • Operacións bit a bit sobre enteiros negativos
  • bit flip( NOT) :~
  • cambio de bits:<<,>>

Para obter máis información sobre como escribir números enteiros en binario, octal e hexadecimal, e como converter números e cadeas binarios, octais e hexadecimais usando as seguintes funcións, consulte o seguinte artigo.

  • bin()
  • oct()
  • hex()
  • format()

Ademais, para operacións lóxicas (operacións booleanas) sobre valores booleanos (verdadeiro, falso) en lugar de operacións bit a bit, consulte o seguinte artigo. Use and,ou en lugar de &,|.

intersección(AND) :&operador

Este é un exemplo de AND lóxico que usa o & operador, co resultado convertido nunha cadea en notación binaria mediante bin().

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

disxunción(OR) :|operador

Un exemplo de produto lóxico (OR) usando o | operador, co resultado convertido nunha cadea en notación binaria mediante bin() e saíndo xuntos.

print(x | y)
print(bin(x | y))
# 11
# 0b1011

Operación EXCLUSIVA-OR(XOR) :^operador

Exemplo dun produto lóxico (XOR) que utiliza o operador ^, combinado co resultado da conversión nunha cadea en notación binaria mediante bin().

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

A relación entre a entrada e a saída de cada bit de AND, OR e XOR lóxico móstrase na táboa seguinte.

Entrada 1Entrada 2intersección(AND)disxunción(OR)Operación EXCLUSIVA-OR(XOR)
11110
10011
01011
00000

Operacións bit a bit sobre enteiros negativos

Cando se realiza unha operación bit a bit sobre un enteiro negativo, o valor procédese coma se se expresase en forma de complemento a dous.

Teña en conta, non obstante, que se converte un enteiro negativo nunha cadea binaria usando bin() ou format(), o valor absoluto terá un signo menos en lugar do formato de complemento a dous.

Se queres obter unha cadea coa representación do complemento a dous, toma AND co número máximo de díxitos de bit necesarios, como se mostra a continuación.

  • Para 4 bits0b1111(=0xf)
  • Para 8 bits0xff
  • Para 16 bits0xffff

Podes obter unha cadea de representación do complemento a dous (cada bit invírtese e engádese 1).

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

bit flip:~operador

~exemplo de cambio de bits con operadores.

A inversión bit a bit non é simplemente o valor de cada bit invertido. O valor de retorno ao usar este operador é o seguinte.
~x#ERROR!-(x+1)

-(x+1)Este valor equivale a considerar o valor de entrada x como unha forma de complemento a dous e a inverter todos os bits.

Como se mencionou anteriormente, en Python, cando un enteiro negativo se converte nunha cadea binaria usando bin(), format(), etc., non está en forma de complemento a dous, senón en valor absoluto cun signo menos. Polo tanto, converter ~x directamente nunha cadea non dará como resultado unha cadea cos bits do valor orixinal invertidos.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

Cando realizamos a operación AND e convertémola nunha cadea de representación en complemento a dous, podemos ver que os bits do valor orixinal están invertidos.

Ademais, por exemplo, para obter unha cadea de bits que é unha cadea de bits de 4 díxitos invertida tal e como está (omitido o bit de signo), use format() para encher os ceros para o valor ANDed como segue04b'

print(bin(~x & 0xff))
print(format(~x & 0b1111, '04b'))
# 0b11110110
# 0110

cambio de bits:<<,>>

Exemplos de desprazamento de bits á esquerda e desprazamento de bits á dereita usando operadores de desprazamento de bits.

x = 9  # 0b1001

print(x << 1)
print(bin(x << 1))
# 18
# 0b10010

print(x >> 1)
print(bin(x >> 1))
# 4
# 0b100

Para valores negativos, o bit de signo esténdese e desprácese e o signo positivo/negativo segue sendo o mesmo. Un valor negativo é unha imaxe dunha liña de 1s toda cara á esquerda.

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

É mellor pensar en termos de cadeas de expresións de complemento a dous, xa que pensar en termos de números non está claro.