W programie niejeden raz może dojść do sytuacji kiedy trzeba zamienić wartości dwóch zmiennych. Zazwyczaj jako pierwszy sposób na rozwiązanie tego problemu podaje się następujący algorytm:
Powyższy algorytm warto bardzo dokładnie przeanalizować. Po pierwsze (2.) deklarowana jest dodatkowa zmienna pomocnicza temp ma ona za zadanie zachować wartość jednej zmiennej, aby można było dokonać zamiany wartości. Wykonywane są łącznie trzy operacje przypisania. Taka metoda sprawdza się dla dowolnego typu danych.
Istnieje jednak bardziej przyjazna komputerowi metoda zamiany wartości zmiennych. Należy jednak pamiętać, że dotyczy to przede wszystkim typów prostych. Podczas korzystania z XOR nie istnieje potrzeba deklaracji dodatkowej zmiennej co pokazuje poniższy kod:
W tym przypadku nie istnieje dodatkowe zapotrzebowanie na pamięć i są wykonywane jedynie trzy operacje logiczne.
XOR w matematyce jest nazywana alternatywą wykluczającą i działa w następujący sposób:
p | q | p XOR q |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
Prześledźmy teraz zamianę wartości 11 i 4, które zapisane binarnie to odpowiednio 1011 i 0100. Pierwsza operacja polega na przypisaniu a wartości 1011 XOR 0100:
a | 1 | 0 | 1 | 1 |
---|---|---|---|---|
b | 0 | 1 | 0 | 0 |
a XOR b | 1 | 1 | 1 | 1 |
W tym momencie zmienna b ma niezmienioną wartość, a wartość zmiennej a można odczytać przy pomocy b. Druga operacja to przypisanie b wartości 0100 XOR 1111:
b | 0 | 1 | 0 | 0 |
---|---|---|---|---|
a | 1 | 1 | 1 | 1 |
b XOR a | 1 | 0 | 1 | 1 |
Warto zauważyć, że teraz sytuacja sie odwróciła: zmienna b już zawiera wartość a, a zmienna a wciąż zawiera połączenie obydwu zmiennych. Ostatni krok polega na odzyskaniu drugiej wartości poprzez operację 1111 XOR 1011:
b | 1 | 1 | 1 | 1 |
---|---|---|---|---|
a | 1 | 0 | 1 | 1 |
b XOR a | 0 | 1 | 0 | 0 |
Po zakończeniu trzeciej operacji XOR otrzymujemy, że a = 01002 = 4 oraz b = 10112 = 11.
W celu przetestowania kodu można skorzystać z poniższego fragmentu kodu:
Napisz funkcją swap, która będzie przyjmować dwie zmienne typu int* o równej długości n. Zadanie polega na napisaniu program, który zamieni wszystkie wartości na obu listach wykorzystując do tego funkcję logiczną XOR.