Uczymy się zamieniać zmienne wartościami wykorzystując tylko i wyłącznie operatory binarne. Do dzieła.
Oto przykład z poprzedniej lekcji, jak zamienialiśmy matematycznie:
let a = 8;
let b = 3;
a = a + b;
b = a - b;
a = a - b;
console.log(a, b);
//3, 8
Wystarczy zamienić operator dodawania oraz odejmowania na XOR:
let a = 8;
let b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a, b);
//3 8
Żeby było jasne – XOR nie dokonuje odejmowania ani dodawania. Natomiast sam algorytm działa w podobny sposób, to jest wykonując te wszystkie kroki, koniec końców zmienne zamieniają się wartościami.
Zobaczmy jak to działa:
a = 8
b = 3
a = 8 ^ 3
1 0 0 0
0 0 1 1
------- ^
1 0 1 1 (11)
a = 11
b = 11 ^ 3
1 0 1 1
0 0 1 1
------- ^
1 0 0 0 (8)
b = 8
a = 11 ^ 8
1 0 1 1
1 0 0 0
------- ^
0 0 1 1 (3)
a = 3
b = 8
Jeszcze raz – xor nie wykonuje ani dodawania ani odejmowania. On w tym algorytmie zastępuje oba operatory i ten algorytm tak działa, że wykonując te kroki dostaniemy zmienne z zamienionymi liczbami, co możemy przeanalizować powyżej.
8 ^ 3 oraz 8 + 3 dają 11, ale jest to przypadkowa koincydencja. Zobaczmy na 5 i 4:
0 1 0 1
0 1 0 0
-------- ^
0 0 0 1
5 ^ 4 daje 1 zaś 5 + 4 to 9. Natomiast jak dalej będziemy drążyć to ten algorytm zamieni nam wartości:
0 1 0 1 <-- a (5)
0 1 0 0 <-- b (4)
-------- ^
0 0 0 1 <--- nowe a
b = a ^ b
0 0 0 1 <---- a
0 1 0 0
-------^
0 1 0 1 (5) <---- nowe b
a = a ^ b
0 0 0 1
0 1 0 1
-------^
0 1 0 0 (4)
b = 5
a = 4