Operatori bitwise Python (prodotto logico, OR logico, OR esclusivo, inversione, shift)

Attività commerciale

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

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

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 1Ingresso 2intersezione (AND)disgiunzione (OR)Operazione EXCLUSIVE-OR (XOR)
11110
10011
01011
00000

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-bit0b1111 (=0xf)
  • Per 8-bit0xff
  • Per 16-bit0xffff

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

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.