Python - Operatore Bitwise

Ciao a tutti, futuri maghi Python! Oggi intraprenderemo un avventuroso viaggio nel mondo degli operatori bitwise. So cosa potreste pensare: "Operatori bitwise? Sembra qualcosa che solo gli scienziati informatici si preoccupano di!" Ma credetemi, comprendere questi operatori può essere incredibilmente utile e persino divertente! Allora, immergiamoci e sveliamo insieme i misteri dei bit e dei byte.

Python - Bitwise Operators

Operatori Bitwise di Python

Gli operatori bitwise sono operatori speciali che operano sulle rappresentazioni binarie dei numeri. Manipolano bit singoli, che sono gli unità di dati più piccole nell'informatica. Pensate ai bit come a piccoli interruttori che possono essere sia accesi (1) che spenti (0).

Prima di entrare nel dettaglio di ciascun operatore, diamo un'occhiata rapida a tutti gli operatori bitwise disponibili in Python:

Operatore Nome Descrizione
& AND Imposta ogni bit a 1 se entrambi i bit sono 1
| OR Imposta ogni bit a 1 se uno dei due bit è 1
^ XOR Imposta ogni bit a 1 se solo uno dei due bit è 1
~ NOT Inverte tutti i bit
<< Shift Sinistro Sposta a sinistra inserendo zeri da destra
>> Shift Destro Sposta a destra inserendo copie del bit più a sinistra da sinistra

Ora, esploriamo ciascuno di questi operatori in dettaglio.

Operatore Bitwise AND di Python (&)

L'operatore Bitwise AND (&) confronta ogni bit del primo operando con il bit corrispondente del secondo operando. Se entrambi i bit sono 1, il bit di risultato corrispondente viene impostato a 1. Altrimenti, il bit di risultato corrispondente viene impostato a 0.

Ecco un esempio:

a = 5  # binario: 0101
b = 3  # binario: 0011
risultato = a & b
print(f"{a} & {b} = {risultato}")  # Output: 5 & 3 = 1

In questo esempio, stiamo eseguendo un'operazione bitwise AND tra 5 (0101 in binario) e 3 (0011 in binario). Il risultato è 1 (0001 in binario).

Ecco come funziona:

0101 (5)
& 0011 (3)
----
0001 (1)

Come vedete, solo il bit più a destra è 1 in entrambi i numeri, quindi solo quel bit è 1 nel risultato.

Operatore Bitwise OR di Python (|)

L'operatore Bitwise OR (|) confronta ogni bit del primo operando con il bit corrispondente del secondo operando. Se uno dei due bit è 1, il bit di risultato corrispondente viene impostato a 1. Altrimenti, il bit di risultato corrispondente viene impostato a 0.

Ecco un esempio:

a = 5  # binario: 0101
b = 3  # binario: 0011
risultato = a | b
print(f"{a} | {b} = {risultato}")  # Output: 5 | 3 = 7

In questo caso, stiamo eseguendo un'operazione bitwise OR tra 5 e 3. Il risultato è 7 (0111 in binario).

Ecco il breakdown:

0101 (5)
| 0011 (3)
----
0111 (7)

Il risultato ha un 1 ovunque uno dei numeri originali aveva un 1.

Operatore Bitwise XOR di Python (^)

L'operatore Bitwise XOR (OR esclusivo) (^) confronta ogni bit del primo operando con il bit corrispondente del secondo operando. Se i bit sono diversi, il bit di risultato corrispondente viene impostato a 1. Se i bit sono uguali, il bit di risultato corrispondente viene impostato a 0.

Ecco un esempio:

a = 5  # binario: 0101
b = 3  # binario: 0011
risultato = a ^ b
print(f"{a} ^ {b} = {risultato}")  # Output: 5 ^ 3 = 6

Qui, stiamo eseguendo un'operazione bitwise XOR tra 5 e 3. Il risultato è 6 (0110 in binario).

Ecco come funziona:

0101 (5)
^ 0011 (3)
----
0110 (6)

Il risultato ha un 1 ovunque i bit nei numeri originali erano diversi.

Operatore Bitwise NOT di Python (~)

L'operatore Bitwise NOT (~) è un operatore unario (prende solo un operando) che inverte i bit del suo operando. Ogni 0 diventa 1, e ogni 1 diventa 0.

Ecco un esempio:

a = 5  # binario: 0101
risultato = ~a
print(f"~{a} = {risultato}")  # Output: ~5 = -6

Potreste domandarvi perché il risultato è -6. Questo perché Python utilizza il complemento a due per rappresentare i numeri negativi. Nel complemento a due, il bit più a sinistra rappresenta il segno (0 per positivo, 1 per negativo).

Ecco cosa succede sotto il cofano:

00000101 (5)
~
11111010 (-6 in complemento a due)

Operatore Bitwise Shift Sinistro di Python (<<)

L'operatore Bitwise Shift Sinistro (<<) sposta i bit del primo operando a sinistra di un numero di posizioni specificato dal secondo operando. I nuovi bit sulla destra vengono riempiti con zeri.

Ecco un esempio:

a = 5  # binario: 0101
b = 1
risultato = a << b
print(f"{a} << {b} = {risultato}")  # Output: 5 << 1 = 10

In questo caso, stiamo spostando i bit di 5 a sinistra di una posizione. Il risultato è 10 (1010 in binario).

Ecco cosa succede:

0101 (5)
Sposta a sinistra di 1
1010 (10)

Ogni shift a sinistra moltiplica effettivamente il numero per 2.

Operatore Bitwise Shift Destro di Python (>>)

L'operatore Bitwise Shift Destro (>>) sposta i bit del primo operando a destra di un numero di posizioni specificato dal secondo operando. Per i numeri positivi, i nuovi bit sulla sinistra vengono riempiti con zeri.

Ecco un esempio:

a = 5  # binario: 0101
b = 1
risultato = a >> b
print(f"{a} >> {b} = {risultato}")  # Output: 5 >> 1 = 2

Qui, stiamo spostando i bit di 5 a destra di una posizione. Il risultato è 2 (0010 in binario).

Ecco il breakdown:

0101 (5)
Sposta a destra di 1
0010 (2)

Ogni shift a destra divide effettivamente il numero per 2 (arrotondando verso il basso all'intero più vicino).

Eccoci qua, ragazzi! Abbiamo esplorato la terra degli operatori bitwise in Python. Questi operatori potrebbero sembrare un po' astratti all'inizio, ma sono strumenti incredibilmente potenti, specialmente quando lavorate con operazioni a basso livello o avete bisogno di ottimizzare la performance del vostro codice.

Ricordate, la pratica fa il maestro. Prova a giocare con questi operatori, sperimenta con diversi numeri e vedi quali risultati otterrai. Prima di rendersene conto, manipolerai i bit come un professionista!

Buon coding, e che i bit siano sempre a vostra favore!

Credits: Image by storyset