Swap di due numeri senza usare una variabile d’appoggio

L’altra settimana, ad un amico neo-programmatore, ho posto questo quesito: “Scrivimi il codice per effettuare lo swap di due variabili senza usarne una terza di appoggio” (vecchio quesito che mi aveva posto a suo tempo il mio professore di Ingegneria del Software).Ovviamente, non era consentito cercare la soluzione in Internet! 🙂
La soluzione “classica” prevede l’uso di una variabile di appoggio, quindi:
int x = 7, y = 5, z;
z = x;x = y;y = z;
E fin qui tutto chiaro 🙂 Ma come farlo senza utilizzare “z”?Dopo una settimana, è stata “gettata la spugna” da parte del mio amico quindi vi pubblico qui la soluzione:
int x = 7, y = 5;

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

O, su una linea sola (per gli amanti della brevità):

x ^= y ^= x ^= y;

Chi di voi ha capito il trucco? 🙂

09/02/2012 Edit: se volete vedere la spiegazione dettagliata del funzionamento, potete fare riferimento al post successivo.