Xor výměnový algoritmus
V programování počítače, výměna xor je algoritmus který používá exkluzivní disjunkci (XOR) operace vyměnit hodnoty dvou proměnných bez dočasné proměnné. Tento algoritmus zpracuje využití symmetric rozdílné vlastnosti XOR, to- Xor = 0 pro každý
| Tabulka s obsahem |
| 1 algoritmus 2 vysvětlení 3 kódové příklady 4 použití v praxi |
Standard vyměňovat algoritmy vyžadovat použití dočasného skladu - standardní intuitivní algoritmy k výměně x a y zahrnout:
- kopírování y stranou k dočasnému skladu
- nastavení y být x
- kopírovat dočasná ukládací hodnotová záda k x.
- XOR X a Y a skladovat v X
- XOR X a Y a skladovat v Y
- XOR X a Y a skladovat v X
- X: = X XOR Y
- Y: = X XOR Y
- X: = X XOR Y
- XOR R1, R2
- XOR R2, R1
- XOR R1, R2
Vysvětlení
Například, nechal nás říkat, že my máme dvě hodnoty X = 12 a Y = 10. V binární, my máme
- X = 1 1 0 0
- Y = 1 0 1 0
- X = 0 1 1 0
- Y = 1 0 1 0
- X = 0 1 1 0
- Y = 1 1 0 0
- X = 1 0 1 0
- Y = 1 1 0 0
Obecně nicméně, jestliže my voláme počáteční hodnotu X = x0 a počáteční hodnota Y = y0. Pak, hrát nad kroky, si pamatovat XOR = 0 a b XOR 0 = b
- X = x0 XOR y0, Y = y0
- X = x0 XOR y0, Y = x0 XOR y0 XOR y0 = x0 XOR 0 = x0
- X = x0 XOR y0 XOR x0 = x0 XOR x0 XOR y0 = 0 XOR y0 = y0, Y = x0
Příklady kódu
x86 jazyk symbolických instrukcí
Dodržování kodexu v x86 jazyk symbolických instrukcí používá xor výměnový algoritmus vyměnit hodnotu v registru sekyry s hodnotou v BX registru bez používání dočasná vyrovnávací paměť.
XOR sekyra, BX XOR BX, zrušit XOR sekyru, BXNicméně, všichni x86 mikroprocesory mají XCHG instrukci, která dělá stejnou práci na jeho operands více efektivně než nad sledem XORs.
Pokračování Vizuální základní subrutina vymění hodnoty jeho parametrů používat operátora xor.
Výměna náhradníka (Var1, Var2) Var1 = Var1 Xor Var2 Var2 = Var2 Xor Var1 Var1 = Var1 Xor Var2 končí náhradníka
C
C programovací jazyk kód realizovat XOR výměnu x a y:x ^= y; y ^= x; x ^= y;Nastavení jako překladačové makro je obyčejné pro rozsáhlé užití.
# definovat xorSwap (x, y) {( x) = (x) ^ (y); (y) = (x) ^ (y); (x) = (x) ^ (y);}
Jako funkce:
nicota xorSwap (int * x, int * y) {* x = * x ^ * y; * y = * x ^ * y; * x = * x ^ * y;}To by mělo být poznamenal, že tato funkce nebude pracovat jestliže vy pokusíte se vyměnit něco s sebou (ie tady xorSwap (a var;, a var;) propadne - to přiřadí nulu hodnoty k var).Někteří zkušení programátoři radí, že tato technika by neměla být použita v programování, zatímco jeho účinek není jasný ledaže vy už znáte trik. Nicméně, jiní poznamenávají, že jeho použití je přijatelné stanovovat, že trik je balen v přiměřeně jmenoval makro takový jako výměna nebo XOR _ výměna, nebo vhodný komentovat to kódu je dělán.
Použití algoritmu není neobvyklé ve vloženém shromážděném kódu kde často je velmi dostupný ohraničený prostor pro dočasný výměnový prostor a tato forma výměny může také se vyhnout nákladu/obchodu, který může dělat věci hodně rychleji. Někteří optimalizovat kompilátory moci tvořit kód používat tento algoritmus.
Tento trik mohl také být používán někým snažit se vyhrát Popletl C zápas kódu.
Vidět také: xor, rozdíl symmetric, xor provázaný seznam