Scrivendo lo swap tutto in una dichiarazione, si fa affidamento su effetti collaterali del interna a^=b
espressione rispetto al esterna a^=(...)
espressione. I tuoi compilatori Java e C++ stanno facendo le cose in modo diverso.
Per fare lo swap XOR correttamente, è necessario utilizzare almeno due affermazioni:
a ^= b;
a ^= (b ^= a);
Tuttavia, il modo migliore per scambiare variabili è quello di farlo nel modo più banale, con una variabile temporanea, e lasciare che il compilatore scegliere il modo migliore per farlo in realtà:
int t = a;
a = b;
b = t;
Nel migliore dei casi, il compilatore genererà alcun codice affatto per lo swap di cui sopra, e sarà semplicemente iniziare a trattare i registri che contengono a
e b
viceversa. Non è possibile scrivere alcun codice xor ingannevole che non batte affatto codice.
fonte
2010-10-12 08:19:56
Questo dovrebbe essere evitato a un livello così alto: http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice – JoshD