Scambiare il contenuto di due variabili int senza utilizzare una variabile temporanea: XOR swap

Una domanda interessante che mi è stata posta è: “com’è possibile scambiare il contenuto di due variabili senza utilizzare una variabile temporanea?”.

Infatti, per scambiare il contenuto di due variabili, di solito si utilizza una variabile temporanea (vediamo un esempio in Python):

a = 13
b = 17
c = a
a = b
b = c
>>> a
17
>>> b
13

Ora, per scambiare due variabili senza una variabile temporanea (nel nostro caso l’abbiamo chiamata ‘c’), ho pensato di utilizzare un procedimento di questo tipo:

a = 13
b = 17
a = a+b
b = a-b
a = a-b
>>> a
17
>>> b
13

La soluzione a cui sono arrivato viene classificata come una variante del più diffuso XOR swap algorithm, che, in forma più generale, permette di scambiare due variabili semplicemente usando l’operazione di XOR:

a = 13
b = 17
a = a ^ b
b = a ^ b
a = a ^ b
>>> a
17
>>> b
13

Lo XOR swap può essere utile in casi molto particolari, come ad esempio quando la memoria disponibile è notevolmente limitata.
Bonus point: in Python non c’è bisogno di utilizzare l’algoritmo di XOR swap:

a = 13
b = 17
a, b = b, a
>>> a
17
>>> b
13

E c’è di più: questo “trucco” funziona anche per i tipi di dato non intero!

a = 'homer'
b = 'marge'
a, b = b, a
>>> a
'marge'
>>> b
'homer'

One Reply to “Scambiare il contenuto di due variabili int senza utilizzare una variabile temporanea: XOR swap”

  1. I buoni, vecchi trucchi da duri hacker! ;)

    E l’assegnamento multiplo è una figata, una di quelle cose che rende piacevole l’uso di un linguaggio.

Leave a Reply

Your email address will not be published. Required fields are marked *