Feedback

VB - Werte zweier Variablen tauschen

Veröffentlicht von am 07.03.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.
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

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 10.03.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 10.03.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 12.03.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 12.03.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 20.04.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!