
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.