La razón por la que funciona es porque XOR no pierde información. Podrías hacer lo mismo con las sumas y restas ordinarias si pudieras ignorar el desbordamiento. Por ejemplo, si el par de variables A, B contiene inicialmente los valores de 1,2, se puede intercambiarlos como esto:
// A,B = 1,2
A = A+B // 3,2
B = A-B // 3,1
A = A-B // 2,1
Por cierto hay un viejo truco para codificar una lista enlazada de 2 vías en un solo puntero" ". Suponga que tiene una lista de bloques de memoria en las direcciones A, B y C. La primera palabra de cada bloque es, respectivamente:
// first word of each block is sum of addresses of prior and next block
0 + &B // first word of block A
&A + &C // first word of block B
&B + 0 // first word of block C
Si tiene acceso al bloque A, se le da la dirección de B Para llegar a C, toma el "puntero" en B y resta A, y así sucesivamente. Funciona igual de bien al revés. Para ejecutar a lo largo de la lista, debe mantener los punteros en dos bloques consecutivos.Por supuesto, usaría XOR en lugar de sumar/sumar, por lo que no tendría que preocuparse por el desbordamiento.
Puede ampliar esto a una "web vinculada" si desea divertirse.
Creo que el intercambio de variable xor apesta a los núcleos de ejecución fuera de servicio. Cada xor subsiguiente tiene una dependencia de lectura después de escritura, y necesita esperar a que se complete la respuesta. para x86, es mejor que solo codifiques como siempre. El compilador debería emitir algo decente. – Calyth