Operadores Python bitwise (produto lógico, OR lógico, OR exclusivo, inversão, turno)

O negócio

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

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

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 1Entrada 2intersecção (AND)disjunção (OR)EXCLUSIVA-OU operação (XOR)
11110
10011
01011
00000

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

É 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

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.

Copied title and URL