Python fornece os seguintes operadores bitwise, que realizam conjunção lógica, disjunção lógica, disjunção exclusiva, inversão bitwise, deslocamento de bit esquerdo, e deslocamento de bit direito em cada bit de um valor int do tipo inteiro binário, respectivamente.
&
|
^
~
<<
>>
Nesta secção, começamos por explicar o seguinte.
- intersecção (AND) :
&
- disjunção (OR) :
|
- EXCLUSIVA-OU operação (XOR) :
^
A seguir, discutiremos o seguinte.
- Operações bitwise sobre números inteiros negativos
- bit flip ( NOT) :
~
- deslocamento de bits :
<<
,>>
Para mais informações sobre como escrever números inteiros em binário, octal, e hexadecimal, e como converter números e cordas binários, octal, e hexadecimais usando as seguintes funções, ver o artigo seguinte.
bin()
oct()
hex()
format()
- Artigos relacionados:Converter números e cordas binárias, octais e hexadecimais uns dos outros em Python
Também, para operações lógicas (operações booleanas) sobre valores booleanos (verdadeiros, falsos) em vez de operações bitwise, consultar o artigo seguinte. Usar e,ou em vez de &,|.
- Artigos relacionados:Os operadores lógicos de Python e, ou, e não (conjunção lógica, disjunção, negação)
intersecção (AND) : &operador
Este é um exemplo de uma lógica AND usando o & operador, com o resultado convertido numa string em notação binária por bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
disjunção (OR) : |operador
Um exemplo de um produto lógico (OR) utilizando o | operador, com o resultado convertido numa string em notação binária por bin() e saída em conjunto.
print(x | y) print(bin(x | y)) # 11 # 0b1011
EXCLUSIVA-OU operação (XOR) : ^operador
Exemplo de um produto lógico (XOR) usando o operador ^, combinado com o resultado da conversão para uma string em notação binária usando bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
A relação entre a entrada e a saída para cada bit de lógica AND, OR, e XOR é mostrada na tabela abaixo.
Entrada 1 | Entrada 2 | intersecção (AND) | disjunção (OR) | EXCLUSIVA-OU operação (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Operações bitwise sobre números inteiros negativos
Quando uma operação bitwise é realizada sobre um inteiro negativo, o valor é processado como se fosse expresso na forma de um complemento de dois.
Note, contudo, que se converter um número inteiro negativo para uma cadeia binária usando bin() ou formato(), o valor absoluto terá um sinal de menos em vez de um formato complementar de dois.
Se quiser obter um fio com a representação de dois complementos, tome AND com o número máximo de dígitos de bits necessários, como se mostra abaixo.
- Para 4 bits
0b1111
(=0xf
) - Para 8 bits
0xff
- Para 16-bit
0xffff
É possível obter uma representação de dois complementos (cada bit é invertido e 1 é adicionado).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Artigos relacionados:Converter números e cordas binárias, octais e hexadecimais uns dos outros em Python
bit flip : ~operador
~exemplo de folheamento de bits com os operadores.
A inversão bit a bit não é simplesmente o valor de cada bit invertido. O valor de retorno ao utilizar este operador é o seguinte.~x
=-(x+1)
-(x+1)
Este valor é equivalente a considerar o valor de entrada x como uma forma de complemento de dois e invertendo todos os bits.
Como mencionado acima, em Python, quando um inteiro negativo é convertido numa cadeia binária usando bin(), formato(), etc., não está na forma de complemento de dois, mas em valor absoluto com um sinal de menos. Portanto, a conversão de ~x directamente para uma cadeia de caracteres não resultará numa cadeia com os bits do valor original invertidos.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Quando realizamos a operação AND e a transformamos numa cadeia de representação do complemento de dois, podemos ver que os bits do valor original estão invertidos.
Além disso, por exemplo, para obter uma cadeia de bits que é uma cadeia de bits de 4 dígitos invertidos como está (bit de sinal omitido), use o formato() para preencher os zeros para o valor ANDed da seguinte forma'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
deslocamento de bits : << , >>
Exemplos de deslocamento de bits para a esquerda e para a direita utilizando operadores de deslocamento 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 sinal é prolongado e deslocado, e o sinal negativo positivo permanece o mesmo. Um valor negativo é uma imagem de uma linha de 1s até à 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
É melhor pensar em termos de cadeias de duas expressões complementares, uma vez que pensar em termos de números não é claro.