Operatori Bitwise in Python
Gli operatori bitwise in Python permettono di manipolare direttamente i bit di numeri interi. Questi operatori sono comunemente utilizzati in programmazione di basso livello, come nello sviluppo di sistemi embedded o per l’ottimizzazione delle prestazioni, ma sono utili anche in contesti di crittografia, compressione e manipolazione di dati binari.
In questo articolo esploreremo i vari operatori bitwise disponibili in Python, insieme a esempi pratici per capire come funzionano.
1. Operatori Bitwise di Base
a. AND Bitwise (&
)
L’operatore &
confronta due numeri bit per bit e restituisce 1
solo quando entrambi i bit corrispondenti sono 1
.
Esempio di AND Bitwise
a = 5 # Binario: 0101
b = 3 # Binario: 0011
risultato = a & b # Binario: 0001 (1 in decimale)
print(risultato) # Output: 1
b. OR Bitwise (|
)
L’operatore |
confronta due numeri bit per bit e restituisce 1
quando almeno uno dei due bit corrispondenti è 1
.
Esempio di OR Bitwise
a = 5 # Binario: 0101
b = 3 # Binario: 0011
risultato = a | b # Binario: 0111 (7 in decimale)
print(risultato) # Output: 7
c. XOR Bitwise (^
)
L’operatore ^
confronta due numeri bit per bit e restituisce 1
solo quando i bit corrispondenti sono diversi.
Esempio di XOR Bitwise
a = 5 # Binario: 0101
b = 3 # Binario: 0011
risultato = a ^ b # Binario: 0110 (6 in decimale)
print(risultato) # Output: 6
d. NOT Bitwise (~
)
L’operatore ~
inverte tutti i bit di un numero, trasformando 1
in 0
e viceversa. Questo è un’operazione unaria, cioè agisce su un solo operando.
In Python, il risultato di ~n
è equivalente a -(n + 1)
.
Esempio di NOT Bitwise
a = 5 # Binario: 0101
risultato = ~a # Inversione dei bit: -6 (in binario: -0110)
print(risultato) # Output: -6
2. Operatori di Shift (Scorrimento di Bit)
Gli operatori di shift spostano i bit di un numero a destra o a sinistra di un numero specificato di posizioni.
a. Shift a Sinistra (<<
)
L’operatore <<
sposta i bit di un numero a sinistra di un numero specificato di posizioni. Questo equivale a moltiplicare il numero per 2
tante volte quante sono le posizioni di shift.
Esempio di Shift a Sinistra
a = 5 # Binario: 0101
risultato = a << 2 # Sposta a sinistra di 2 posizioni: 010100 (20 in decimale)
print(risultato) # Output: 20
b. Shift a Destra (>>
)
L’operatore >>
sposta i bit di un numero a destra di un numero specificato di posizioni. Questo equivale a dividere il numero per 2
tante volte quante sono le posizioni di shift, arrotondando per difetto.
Esempio di Shift a Destra
a = 20 # Binario: 10100
risultato = a >> 2 # Sposta a destra di 2 posizioni: 101 (5 in decimale)
print(risultato) # Output: 5
3. Utilizzo Combinato degli Operatori Bitwise
Gli operatori bitwise possono essere combinati tra loro per eseguire operazioni piĂą complesse sui bit. Vediamo un esempio in cui combiniamo gli operatori di AND, OR e XOR.
Esempio Combinato
a = 12 # Binario: 1100
b = 10 # Binario: 1010
# AND bitwise
and_bitwise = a & b # Risultato: 1000 (8 in decimale)
# OR bitwise
or_bitwise = a | b # Risultato: 1110 (14 in decimale)
# XOR bitwise
xor_bitwise = a ^ b # Risultato: 0110 (6 in decimale)
print(f"AND: {and_bitwise}, OR: {or_bitwise}, XOR: {xor_bitwise}")
Output:
AND: 8, OR: 14, XOR: 6
4. Operatori di Assegnazione Bitwise
Python supporta anche operatori di assegnazione combinati con gli operatori bitwise, che permettono di eseguire operazioni sui bit e assegnare il risultato in un’unica espressione.
Esempi di Operatori di Assegnazione Bitwise
-
&=
: AND Bitwise e assegnax = 5 # Binario: 0101 x &= 3 # Binario: 0011 -> Risultato: 0001 (1 in decimale) print(x) # Output: 1
-
|=
: OR Bitwise e assegnax = 5 # Binario: 0101 x |= 3 # Binario: 0011 -> Risultato: 0111 (7 in decimale) print(x) # Output: 7
-
^=
: XOR Bitwise e assegnax = 5 # Binario: 0101 x ^= 3 # Binario: 0011 -> Risultato: 0110 (6 in decimale) print(x) # Output: 6
-
<<=
: Shift a sinistra e assegnax = 3 # Binario: 0011 x <<= 2 # Sposta a sinistra di 2 posizioni -> Risultato: 1100 (12 in decimale) print(x) # Output: 12
-
>>=
: Shift a destra e assegnax = 8 # Binario: 1000 x >>= 2 # Sposta a destra di 2 posizioni -> Risultato: 0010 (2 in decimale) print(x) # Output: 2
5. Applicazioni Comuni degli Operatori Bitwise
Gli operatori bitwise sono particolarmente utili in contesti di programmazione di basso livello, come:
- Manipolazione di flag: Per gestire più opzioni o configurazioni utilizzando un unico intero come “bitmask”.
- Compressione dei dati: Per ridurre lo spazio utilizzato da piĂą informazioni combinate in un singolo valore binario.
- Criptografia: Operazioni bitwise sono alla base di molti algoritmi di cifratura.
- Controllo di parità : Puoi usare l’operatore
&
per verificare rapidamente se un numero è pari o dispari.
Esempio: Controllare Se un Numero è Pari o Dispari
numero = 7
if numero & 1 == 0:
print(f"{numero} è pari")
else:
print(f"{numero} è dispari")
Output:
7 è dispari
In questo esempio, l’operatore &
viene utilizzato per verificare se l’ultimo bit di numero
è 1
o 0
. Se è 1
, il numero è dispari; se è 0
, il numero è pari.
Conclusione
Gli operatori bitwise in Python sono potenti strumenti per manipolare i singoli bit di numeri interi. Anche se possono sembrare complessi, sono essenziali in molte applicazioni pratiche come la gestione di flag, la crittografia e l’ottimizzazione delle prestazioni. Comprendere questi operatori
ti permette di lavorare a un livello piĂą basso e di sfruttare appieno le capacitĂ del linguaggio Python.