Digamos que tenemos dos variables (a, b) y queremos intercambiarlas, es decir que una tome el valor de la otra:
int temp = a; a = b; b = temp;
Nada más fácil, ¿verdad? Creamos una variable temporal para poder resguardar el valor de a mientras asignamos a = b, y luego asignamos a b el valor previo de a.
Es necesario crear esta variable temporal para no perder el valor de la primera variable que intercambiamos… ¿o no? Qué tal esto:
a = a ^ b; b = a ^ b; a = a ^ b;
Si ejecutamos el fragmento de código en C podemos comprobar que los valores de a y b han sido intercambiados sin haber usado nunca una variable intermedia. ¿Qué está pasando?
La operación OR exclusivo (^) tiene un par de propiedades interesantes que están actuando en este caso. Un número combinado con sí mismo es igual a cero (a ^ a = 0), y un número combinado con cero es igual a sí mismo (a ^ 0 = a).
En la primera línea estamos asignando a = a ^ b. Luego en la segunda línea estamos asignando b = a ^ b, pero recordemos que ahora a = a ^ b, por lo tanto queda b = a ^ b ^ b.
b ^ b se cancela, por lo que efectivamente en la segunda línea estamos asignando b = a.
Igualmente en la tercera línea asignamos a = a ^ b, pero recordemos que antes de la asignación a contiene el valor a ^ b, y b contiene el valor de a, por lo tanto estamos asignando a = a ^ b ^ a, efectivamente a = b.
Este algoritmo se llama XOR swap. Y no es que tenga mucha utilidad práctica, pero es una linda curiosidad del mundo de la computación.