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()
- Artigos relacionados:Converte números e cadeas binarios, octais e hexadecimais entre e entre si en Python
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 &,|.
- Artigos relacionados:Operadores lóxicos de Python and, or, and not (conxunción lóxica, disxunción, negación)
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 1 | Entrada 2 | intersección(AND) | disxunció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 |
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 bits
0b1111
(=0xf
) - Para 8 bits
0xff
- Para 16 bits
0xffff
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
- Artigos relacionados:Converte números e cadeas binarios, octais e hexadecimais entre e entre si en Python
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.