Sprache: VB
Simpel lassen sich zwei variable Werte mittels eines Buffers tauschen:[code]
Dim a As Byte = 10, b As Byte = 13
Dim c as New Byte 'Buffer
c = a
a = b
b = c[/code]
Mithilfe des bitweisen Exklusiv-Operators XOR lässt sich dies aber auch ohne Hilfsvariable lösen. Wie die Addition gehorcht XOR sowohl dem Kommutativ- als auch dem Assoziativgesetz, d.h. sowohl Vertauschung von Argumenten als auch Umsetzen von Klammern innerhalb der Operation spielen keine Rolle und führen zum selben Ergebnis.
Durch Äquivalenzumformung lässt sich das Prinzip gut veranschaulichen:[code]
a = a XOR b
b = a XOR b
= (a XOR b) XOR b
= a XOR b XOR b
= a XOR 0
= a
a = b XOR a
= a XOR (a XOR b)
= a XOR a XOR b
= 0 XOR b
= b[/code]
Diese Methode ist auf alle ganzzahligen Datentypen anwendbar.
Sub switchValue(ByRef a As Long, ByRef b As Long)
a = a Xor b
b = b Xor a
a = a Xor b
End Sub
Sub switchValue(ByRef a As Long, ByRef b As Long)
a = a Xor b
b = b Xor a
a = a Xor b
End Sub
Alte URL:
/snippet/werte-zweier-variablen-tauschen/1504
Hallo,
1. Der XOR Operator ist in VB nicht ^ sondern XOR ( ^ ist der Potenzoperator)
2. Diese Methode ist NICHT auf jeden Datentyp anwendbar, sondern nur auf ganzzahlige (long). XOR ist eine bitweise(!) Operation.
Was soll die bitweise Verknüpfung von zwei beliebigen Objekten (z.B. ein String) der XOR nicht überschreibt sein?
Du kannst nicht einfach logische Operationen auf Objekte übertragen.
Zum Operatorzeichen: Ein Übertragungsfehler, da unter Python mit diesem Thema began, wo ^ Xor und ** Potenzen entspricht, pardon.
Zum Datentyp: Selbstverständlich mein(t)e ich damit alle Ganzzahltypen, ich habe mich missverständlich ausgedrückt.
Jup, nix für ungut 😉
Ich würde aber noch die Argumente prüfen ob sie tatsächlich ein ganzzahliger Datentyp sind oder statt object gleich long nehmen, sonst wird eine „Invalid cast“ exception geworfen.
Nettes Thema im übrigen, ich habe mal die Zeit gestoppt die der Code für 10 Millionen Vertauschungen vom Typ long im Gegensatz zum „normalen“ vertauschen mit Hilfsvariablen:
(Intel Core i3 3,04 Ghz , 4GB RAM, Win7 x64)
XOR: 9678 ms
„Normal“: 2659 ms
Die Standard Variante mit Hilfsvariable ist um den Faktor 3,7 schneller, braucht aber um die Hälfte mehr Speicher.
Zum Vergleich noch eine Variante mit Pointern, mit C# im unsafe Kontext:
[code]unsafe static void SwitchValues(long* a, long* b)
{
long* tmp = a;
a = b;
b = tmp;
}[/code]
Diese Methode braucht bei für 10 Mio. Vertauschungen 480 ms, ist also nochmal um den Faktor 5,5 schneller als die Standard Methode.
Ja, die XOR-Methode sollte man nur bei begrenzten Ressourcen anwenden, ist aber dennoch eine schöne Alternative zum Experimentieren und Verstehen.
Es gibt noch eine andere Möglichkeit:
[code ///
///
/// /// public static void Switch1(ref int A, ref int B)
{
B = B + A – (A = B);
}[/code]