Feedback

VB - Werte zweier Variablen tauschen

Veröffentlicht von am 3/7/2011
(0 Bewertungen)
Simpel lassen sich zwei variable Werte mittels eines Buffers tauschen:

Dim a As Byte = 10, b As Byte = 13
Dim c as New Byte 'Buffer
c = a
a = b
b = c

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:

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

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

5 Kommentare zum Snippet

Scavanger schrieb am 3/10/2011:
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.

Klemens Nanni schrieb am 3/10/2011:
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.
Scavanger schrieb am 3/12/2011:
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:

unsafe static void SwitchValues(long* a, long* b)
{
long* tmp = a;
a = b;
b = tmp;
}


Diese Methode braucht bei für 10 Mio. Vertauschungen 480 ms, ist also nochmal um den Faktor 5,5 schneller als die Standard Methode.
Klemens Nanni schrieb am 3/12/2011:
Ja, die XOR-Methode sollte man nur bei begrenzten Ressourcen anwenden, ist aber dennoch eine schöne Alternative zum Experimentieren und Verstehen.
Legion schrieb am 4/20/2011:
Es gibt noch eine andere Möglichkeit:
[code /// <summary>
///
/// </summary>
/// <param name="A"></param>
/// <param name="B"></param>
public static void Switch1(ref int A, ref int B)
{
B = B + A - (A = B);
}[/code]
 

Logge dich ein, um hier zu kommentieren!