Der Grund, warum es funktioniert, ist, weil XOR keine Informationen verliert. Sie könnten dasselbe mit gewöhnlicher Addition und Subtraktion tun, wenn Sie den Überlauf ignorieren könnten. Wenn zum Beispiel die Variable Paar A, ursprünglich B die Werte 1,2 enthält, können Sie sie wie folgt tauschen:
// A,B = 1,2
A = A+B // 3,2
B = A-B // 3,1
A = A-B // 2,1
BTW es ist ein alter Trick zum Codieren eines 2-Wege-verkettete Liste in einem einzigen „Zeiger ". Sie eine Liste der Speicherblöcke an den Adressen A, B und C. Das erste Wort in jedem Block ist jeweils Angenommen haben:
// 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
Wenn Sie Zugang haben zu einem Block, es gibt Ihnen die Adresse von B Um zu C zu gelangen, nehmen Sie den "Zeiger" in B und subtrahieren Sie A, und so weiter. Es funktioniert genauso gut rückwärts. Um die Liste zu durchlaufen, müssen Sie die Zeiger auf zwei aufeinanderfolgende Blöcke halten.Natürlich würden Sie XOR anstelle von Addition/Subtraktion verwenden, damit Sie sich keine Gedanken über Überlauf machen müssen.
Sie könnten dies zu einem "verlinkten Web" erweitern, wenn Sie Spaß haben möchten.
ich denke, die xor Variable Swap saugt Kerne Ausführung out-of-order auf. Jeder nachfolgende Xor hat eine Lese-nach-Schreib-Abhängigkeit und muss auf den Abschluss der Antwort warten. für x86, Sie sind besser dran, nur als normal zu codieren. Der Compiler sollte etwas Anständiges ausgeben. – Calyth