Al escribir su canje de todos en un estado de cuenta, usted está confiando en los efectos secundarios de la expresión a^=b
interior con respecto al a^=(...)
expresión externa. Sus compiladores de Java y C++ están haciendo las cosas de manera diferente.
Con el fin de hacer el canje xor correctamente, usted tiene que utilizar al menos dos estados:
a ^= b;
a ^= (b ^= a);
Sin embargo, la mejor manera de cambiar las variables es hacerlo de la manera mundana con una variable temporal, y dejar que el compilador de elegir la mejor manera de hacerlo realidad:
int t = a;
a = b;
b = t;
en el mejor de los casos, el compilador generará ningún código en absoluto para el canje anterior, y simplemente comenzar a tratar a los registros que mantienen a
y b
al revés. No puede escribir ningún código xor complicado que no supere ningún código.
Esto se debe evitar en un nivel tan alto: http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice – JoshD