Reklama

Výměna hodnot dvou proměnných bez nutnosti využití třetí proměnné

Úvod

Při prohlížení internetu jsem narazil na zajímavý způsob výměny hodnot dvou proměných bez nutnosti použití třetí pomocné proměnné, která by ukládala mezivýsledek. Původní článek lze nalézt ZDE. Nejedná se o žádné veliké objevení Ameriky, ale myslím, že tento trik není tak moc znám, tak ho zde uvedu.

Popis

Celé kouzlo spočívá pouze v maskování bitů pomocí bitového exkluzivního součtu XOR. Pravdivostní tabulka pro funkci XOR je následující:

 

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

 

Teď už k samotné záměně hodnot dvou proměnných. Je zapotřebí, aby dané hodnoty byly stejného datového typu. Ukážeme si příklad pomocí dvou proměnných typů “unsigned char”.

 
x = 14 => 00001110 (binárně)
y = 28 => 00011100 (binárně)
 
x = x XOR y => x = 00001110 XOR 00011100 => x = 00010010 = 18
y = x XOR y => y = 00010010 XOR 00011100 => y = 00001110 = 14
x = x XOR y => x = 00010010 XOR 00001110 => x = 00011100 = 28
 
unsigned char x = 14;
unsigned char y = 28;
 
První více názorný postup v jazyce C
 
x = x ^ y;
y = y ^ x;
x = x ^ y;
 
Druhý zkrácený postup v jazyce C
 
x ^= y;
y ^= x;
x ^= y;
 
Funkce pro výměnu dvou proměnných typu “int” pomocí ukazatelů v jazyce C
 

001: void XORSwap(int *x, int *y)
002: {
003: if (x != y)
004: {
005: *x ^= *y;
006: *y ^= *x;
007: *x ^= *y;
008: }
009: }
Následující a předchozí příspěvek v kategorii:

 
Předchozí: Kruhová vyrovnávací paměť “buffer” pro mikrokontrolér ATmega(16/32)
 

 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.