Python fornisce i seguenti operatori bitwise, che eseguono rispettivamente congiunzione logica, disgiunzione logica, disgiunzione esclusiva, inversione bitwise, spostamento di bit a sinistra e spostamento di bit a destra su ogni bit di un valore intero binario di tipo int.
&
|
^
~
<<
>>
In questa sezione, spieghiamo innanzitutto quanto segue.
- intersezione (AND) :
&
- disgiunzione (OR) :
|
- Operazione EXCLUSIVE-OR (XOR) :
^
In seguito, discuteremo quanto segue.
- Operazioni bitwise su interi negativi
- bit flip ( NOT) :
~
- spostamento di bit :
<<
,>>
Per maggiori informazioni su come scrivere numeri interi in binario, ottale ed esadecimale, e su come convertire numeri e stringhe binari, ottali ed esadecimali usando le seguenti funzioni, vedi il seguente articolo.
bin()
oct()
hex()
format()
- Articoli correlati:Convertire numeri binari, ottali ed esadecimali e stringhe da e verso l'altro in Python
Inoltre, per le operazioni logiche (operazioni booleane) su valori booleani (vero, falso) invece delle operazioni bitwise, fate riferimento al seguente articolo. Usate and,or invece di &,|.
- Articoli correlati:Operatori logici di Python e, o, e non (congiunzione logica, disgiunzione, negazione)
intersezione (AND) : &operatore
Questo è un esempio di AND logico usando l'operatore &, con il risultato convertito in una stringa in notazione binaria da bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
disgiunzione (OR) : |operatore
Un esempio di prodotto logico (OR) usando l'operatore |, con il risultato convertito in una stringa in notazione binaria da bin() e l'output insieme.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Operazione EXCLUSIVE-OR (XOR) : ^operatore
Esempio di un prodotto logico (XOR) usando l'operatore ^, combinato con il risultato della conversione in una stringa in notazione binaria usando bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
La relazione tra l'ingresso e l'uscita per ogni bit di AND, OR e XOR logici è mostrata nella tabella sottostante.
Ingresso 1 | Ingresso 2 | intersezione (AND) | disgiunzione (OR) | Operazione EXCLUSIVE-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Operazioni bitwise su interi negativi
Quando un'operazione bitwise viene eseguita su un intero negativo, il valore viene processato come se fosse espresso in forma di complemento a due.
Notate, tuttavia, che se convertite un intero negativo in una stringa binaria usando bin() o format(), il valore assoluto avrà un segno meno invece di un formato a due complementi.
Se volete ottenere una stringa con rappresentazione a due complementi, prendete AND con il numero massimo di cifre di bit richiesto, come mostrato qui sotto.
- Per 4-bit
0b1111
(=0xf
) - Per 8-bit
0xff
- Per 16-bit
0xffff
Si può ottenere una stringa di rappresentazione a due complementi (ogni bit è invertito e viene aggiunto 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Articoli correlati:Convertire numeri binari, ottali ed esadecimali e stringhe da e verso l'altro in Python
bit flip : ~operatore
~esempio di bit flipping con operatori.
L'inversione bitwise non è semplicemente il valore di ogni bit invertito. Il valore di ritorno quando si usa questo operatore è il seguente.~x
=-(x+1)
-(x+1)
Questo valore è equivalente a considerare il valore d'ingresso x come un complemento a due e invertire tutti i bit.
Come detto sopra, in Python, quando un intero negativo viene convertito in una stringa binaria usando bin(), format(), ecc., non è in forma di complemento a due, ma in valore assoluto con un segno meno. Pertanto, la conversione di ~x direttamente in una stringa non risulterà in una stringa con i bit del valore originale invertiti.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Quando eseguiamo l'operazione AND e la trasformiamo in una stringa di rappresentazione del complemento a due, possiamo vedere che i bit del valore originale sono invertiti.
Inoltre, per esempio, per ottenere una stringa di bit che è una stringa di bit a 4 cifre invertita così com'è (bit di segno omesso), usate format() per riempire gli zeri per il valore ANDed come segue'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
spostamento di bit : << , >>
Esempi di spostamento di bit a sinistra e spostamento di bit a destra usando operatori di spostamento di bit.
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 di segno è esteso e spostato, e il segno positivo-negativo rimane lo stesso. Un valore negativo è l'immagine di una linea di 1 tutta a sinistra.
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
È meglio pensare in termini di stringhe di espressioni di complemento a due, poiché pensare in termini di numeri non è chiaro.