C++ Zwei Variablen ohne ein 3. tauschen?

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo. Neulich hat mir jemand einen Ruby beispiel gezeigt, er tausche ganz einfach zwei Variablen:
PHP:
i,j = j,i
So einfach. Fand ich ganz nett, geht sowas auch unter C++ bzw. was ist die einfachste Lösung? Also jetzt ohne eine dritte Varianble zu nehmen?

Danke und Gruß
 
Es ist nicht möglich bei 2 Variablen ohne eine 3te zu tauschen, du könntest dir eine Funktion schreiben die das macht so das du nicht jedes mal eine 3te anlegen musst. Anders wird Ruby das Intern auch nicht machen (können).
Es kann sein das es eine Funktion in C++ dafür gibt, mir würde nur eine zum Austauschen in Listen einfallen.
 
Zuletzt bearbeitet:
Wo du recht, hast du recht, danke für den Link. Das liese sich in C/C++ natürlich ohne weiteres umsetzen, trotzdem wüsste ich keine Funktion die das von sich aus macht.

Frag mich nur noch ob es langsamer ist als mit einer 3ten Variable. Omg ich werd jetzt nicht anfangen das auszuprobieren oder gar zu berechnen^^.
 
Zuletzt bearbeitet:
In Hochsprachen ist ein XOR-Swap aufgrund der damit verbundenen schlechteren Lesbarkeit (es ist nicht mehr für jeden Entwickler klar erkennbar, was gemacht wird) kaum sinnvoll, in maschinennäheren Sprachen schon.

XOR-Swap funktioniert natürlich am effizientesten bei Datentypen, die in ein Register passen (z.B. ordinale Datentypen aus C/C++).

Ein XOR-Swap (3 Assembler-Befehle) ist schneller als ein Swap mit einer dritten Variable (mind. 4 Asm-Befehle, da Stack-Manipulation für 3. Variable + 3x MOV).
 
Das für mich wichtigste KO Kriterium zum XOR Swap wäre, dass beim XOR Swap die 2 Werte verloren gehen können, wenn es sich um gleiche Werte handelt, da dabei ein Werte dann auf 0 gesetzt wird, z.B.:

Pseudocode:
Code:
a = 1
b = 1
xor swap a, b
--> a == 0
--> b == 1

Zusammenfassend würde ich zum XOR Swap sagen:
- XOR Swap ist nice to know
- XOR Swap löscht Inhalte von Variablen, wenn diese den gleichen Wert haben
- XOR Swap ist weniger leicht menschenlesbar in einer Hochsprache wie C / C++
- XOR Swap wird evtl. nicht vom Compiler/Optimizer erkannt und optimiert und somit 1:1 umgesetzt
- XOR Swap kann nicht vom Prozessor parallelisiert werden, da jede Anweisung abhängig von dem Ergebnis der vorangehenden Anweisung ist
- Alternative: x86 Prozessoren unterstützen die XCHG Anweisung, die vom Compiler verwendet werden kann, wenn er einen Swap in der Hochsprache erkennt, was den Tausch auf 1 Anweisung (Asm Befehl) reduziert
 
Zuletzt bearbeitet:
Rossibaer schrieb:
Das für mich wichtigste KO Kriterium zum XOR Swap wäre, dass beim XOR Swap die 2 Werte verloren gehen können, wenn es sich um gleiche Werte handelt, da dabei ein Werte dann auf 0 gesetzt wird

Probleme treten nicht bei gleichen Werten auf, sondern wenn a und b den selben Speicher belegen.

Bei gleichem Wert funktioniert es wie an diesem Beispiel ersichtlich:

Code:
a = a xor b
b = a xor b
a = a xor b

a=1, b=1

a = 1 xor 1 = 0
b = 0 xor 1 = 1
a = 0 xor 1 = 1
 
DjNBB: Wo du recht hast, habs übersehen ... Also mit Zeigern wird man seine wahre Freude haben.
 
Zurück
Oben