Skip to content

Operatori bitwise in Python (AND, OR, XOR, NOT, SHIFT)

Python

Python fornisce gli operatori bit per bit, &(AND), |(OR), ^(XOR), ~(NOT, invert), <<(MAIUSC A SINISTRA), >>(MAIUSC A DESTRA).

In questo articolo vengono descritti i seguenti contenuti.

  • un po’ E:&
  • Un po’ OPPURE:|
  • XOR un po’:^
  • Operazioni bit a bit con numeri interi negativi
  • Bitwise NOT, inverti:~
  • Spostamenti di bit:<<, >>

Per ulteriori informazioni sulla conversione di numeri e stringhe binari, ottali ed esadecimali utilizzando bin(), oct(), hex() e format(), vedere gli articoli seguenti.

Per le operazioni booleane sui tipi bool (True, False) anziché le operazioni bit per bit, vedere l’articolo seguente. Utilizzare eeo invece di & e |.

un po’ E:&

AND bit per bit con l’operatore &:

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

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

Un po’ OPPURE:|

OPPURE un po’ con | operatore:

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

XOR un po’:^

Bitwise XOR con l’operatore ^:

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

Gli ingressi e le uscite per ciascun bit di AND, OR e XOR sono i seguenti.

Ingresso 1 Ingresso 2 e o XOR
1 1 1 1 0
1 0 0 1 1
0 1 0 1 1
0 0 0 0 0

Operazioni bit a bit con numeri interi negativi

Le operazioni bit per bit su interi negativi vengono gestite come se i valori erano espressi in complemento a due.

Tuttavia, si noti che se si converte un numero intero negativo in una stringa binaria utilizzando bin() o format(), verrà utilizzato il segno meno invece del formato del complemento a due.

Se vuoi ottenere una stringa espressa nella rappresentazione in complemento a due, prendi l’AND bit per bit e il numero massimo di cifre richieste, ad esempio, 0b1111 (= 0xf) per 4 bit, 0xff per 8 bit e 0xffff per 16 bit.

x = -9

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

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

Bitwise NOT, inverti:~

L’operatore ~ ​​restituisce l’inversione bit per bit. L’inversione bit per bit di x è definita come -(x+1).

Se il valore di input x è considerato complemento a due e tutti i bit sono invertiti, è equivalente a -(x+1).

La conversione di ~x in una stringa non genera una stringa con i bit del valore originale invertiti.

x = 9  # 0b1001

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

Eseguendo l’operazione AND per creare una stringa di rappresentazione in complemento a due, è possibile ottenere una stringa con i bit invertiti.

Ad esempio, per ottenere una stringa invertita di bit di 4 cifre, specificare ’04b’ con format() e riempirla con zeri.

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

Spostamenti di bit:<<, >>

Spostamento a sinistra e spostamento a destra con operatori <<, >>:

x = 9  # 0b1001

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

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

Per i valori negativi, il bit del segno viene espanso e spostato ei segni positivi e negativi non cambiano. I valori negativi sono considerati avere infinito 1 sul lato sinistro.

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

È difficile da capire se lo pensi come un valore numerico, quindi è meglio pensarlo come una stringa in complemento a dovuto.