HOWTO · Python

XOR in Python

Scopri come usare l'operatore XOR in Python con esempi chiari su interi e valori booleani, applicazioni pratiche e spiegazioni dettagliate.

In questa pagina

XOR, o OR esclusivo, confronta due valori e restituisce vero quando esattamente uno dei due è vero. In Python, l’operatore di accento circonflesso (^) esegue XOR su interi e valori booleani. Usalo quando ti serve uno dei due valori, ma non entrambi, oppure quando devi confrontare direttamente i bit.

Che cos’è XOR?

XOR confronta due bit e restituisce 1 quando sono diversi e 0 quando coincidono:

  • 0 XOR 0 = 0
  • 0 XOR 1 = 1
  • 1 XOR 0 = 1
  • 1 XOR 1 = 0

La stessa regola vale per i valori booleani: esattamente un valore True produce True. Per gli interi, Python applica la regola indipendentemente a ogni coppia di bit; perciò lo XOR booleano e lo XOR bit a bit sono correlati, ma hanno scopi diversi.

Utilizzare XOR con gli interi

Usa l’operatore di accento circonflesso (^) per calcolare lo XOR bit a bit di due interi:

a = 5  # Binary: 0101
b = 3  # Binary: 0011

result = a ^ b
print(result)
6

La rappresentazione binaria di 5 è 0101, mentre quella di 3 è 0011. Confrontando i bit corrispondenti si ottiene:

  • 0 XOR 0 = 0
  • 1 XOR 0 = 1
  • 0 XOR 1 = 1
  • 1 XOR 1 = 0

Il risultato è 0110, cioè 6 in decimale. Lo zero iniziale serve solo ad allineare i due operandi; non modifica il valore.

Utilizzare XOR con i valori booleani

Python applica ^ anche ai valori booleani. Il programma seguente mostra tutte e quattro le combinazioni di input e un’implementazione orientata ai valori booleani costruita con and, or e not:

def xor(left, right):
    return (left and not right) or (not left and right)

for left, right in ((False, False), (False, True), (True, False), (True, True)):
    print(f"{left} ^ {right} -> {left ^ right}; xor() -> {xor(left, right)}")
False ^ False -> False; xor() -> False
False ^ True -> True; xor() -> True
True ^ False -> True; xor() -> True
True ^ True -> False; xor() -> False

La funzione è utile quando un’espressione booleana deve avere un’operazione denominata. Con input booleani, left ^ right e xor(left, right) producono gli stessi quattro risultati. La forma logica è pensata per le condizioni booleane; usa ^ per la manipolazione dei bit degli interi.

Applicazioni pratiche di XOR

Il modulo operator espone la stessa operazione della funzione xor(). Può essere comodo quando serve un oggetto funzione e funziona sia con operandi booleani sia con operandi interi:

from operator import xor

print(xor(True, False))
print(xor(5, 3))
True
6

Un’altra tecnica bit a bit nota consente di scambiare due variabili intere senza una variabile temporanea:

x = 10
y = 20

x = x ^ y
y = x ^ y
x = x ^ y

print(x, y)
20 10

Partendo da due interi, le tre operazioni funzionano nel modo seguente:

  1. x diventa lo XOR di x e y.
  2. y viene quindi aggiornato al valore originale di x eseguendo lo XOR tra il nuovo x e y.
  3. Infine, x viene aggiornato al valore originale di y usando la stessa logica.

La tecnica è corretta per le variabili intere, ma nel normale codice Python l’assegnazione mediante spacchettamento di tuple è in genere più chiara: x, y = y, x. La forma con XOR è soprattutto utile per comprendere le operazioni bit a bit o quando si lavora sotto un vincolo che la richiede esplicitamente.

Conclusione

In Python, usa ^ per XOR: confronta direttamente i valori booleani e confronta ogni bit quando gli operandi sono interi. La funzione operator.xor() fornisce la stessa operazione in forma di funzione, mentre and, or e not possono esprimere esplicitamente la regola booleana. Scegli la forma che comunica meglio se il tuo compito è logico o bit a bit.

Domande frequenti

  1. Che cosa significa XOR in Python?
    XOR significa OR esclusivo: produce vero quando esattamente uno dei due input è vero. Con operandi interi, applica questa regola a ogni coppia di bit corrispondenti.

  2. Come eseguo un’operazione XOR su due interi in Python?
    Usa l’operatore di accento circonflesso: result = a ^ b.

  3. Posso usare XOR con i valori booleani in Python?
    Sì. True ^ False e False ^ True sono True, mentre due input booleani uguali producono False.

  4. Qual è un’applicazione pratica di XOR nella programmazione?
    XOR può scambiare due variabili intere tramite tre operazioni bit a bit. Nel normale codice Python, l’assegnazione mediante spacchettamento di tuple è generalmente più chiara.

  5. XOR è commutativo in Python?
    Sì. XOR è commutativo, quindi a ^ b è uguale a b ^ a per operandi compatibili.