Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1896 | Besucher online: 52
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Werte zweier Variablen tauschen


Autor: Klemens Nanni
Sprache: VB.NET
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 3236
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.


Abgelegt unter: bitweise, bitwise, xor, or, oder, exklusiv, exclusive, operator, tauschen, switch, carry, buffer, variable, math, mathe, kommutativ, assoziativ, addition.



Visual Basic
1
2
3
4
5
Sub switchValue(ByRef a As Long, ByRef b As Long)
    a = a Xor b
    b = b Xor a
    a = a Xor b
End Sub
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Scavanger schrieb am:  10.03.2011 13:45:10

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 17:01:06

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 15:17:13

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 18:34:00

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 12:21:13

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]


Diese Snippets könnten für Sie interessant sein:
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Größter gemeinsamer Teiler (2)
[C#] Verschlüsslung von Dateien mit Vernam
[VB.NET] Verschlüsslung von Dateien mit Vernam
[C#] XOR Verschlüsselung
[C#] C# XOR Crypt
[C#] Operatorüberladung
[C#] Der * Operator mal anders...
[C#] Desktop Klasse (CreateDesktop)
[C#] FTP File Upload (mit Buffer)
[C#] Primzahl berechnen (optimiert)
[C#] Berechnung der Entfernung zwischen GPS-Koordinaten
[VB.NET] Das Sieb des Eratosthenes
[VB.NET] Primfaktorzerlegung
[VB.NET] Modulare Exponentation
[VB.NET] Das Sieb von Atkin
[VB.NET] Pandigitale Zahlen
[VB.NET] Binäre Exponentation
[VB.NET] Kleinster natürlicher Teiler > 1
[VB.NET] Das Sieb von Atkin (2) - aktuell
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[C#] Wurzel und Potenz berechnen ohne Math-Klasse
[C#] Summe 1..n berechnen
[C#] Fibonacci-Folge berechnen
[C#] n-te Fibonaccizahl rekursiv berechnen
[C#] Summe 1²...n² berechnen.
[C#] Summe 1³..n³ berechnen.
[C#] größten gemeinsamen Teiler berechnen.
[VB.NET] Multiplikation von übergroßen Zahlen
[C#] Dreiecksberechnung
[VB.NET] PI nach der Bailey-Borwein-Plouffe-Formel berechnen
[VB.NET] Quadratische Gleichung mit der PQ Formel lösen
[VB.NET] Basisrechenfunktionen für einen Kreis
[C++] Exponents
[C#] Quersummenberechnung
[C#] Geodaten in sexagesimal Format umrechnen
[VB.NET] Größten gemeinsamen Teiler berechnen
[VB.NET] Quadratwurzel ohne Sqrt() Funktion ziehen
[C#] Addiere alle ganzen Zahlen von x bis y
[C++] Caesar
[C#] "echte" Teiler Summe berechnen
[C#] Formelevaluierung aus RPN Form
[C#] Prüfung auf narzisstische Zahlen
[C#] CellMatrix
[C#] Maschinengenauigkeit
[C#] Flächenberechnungen am Kreis,Quadrat,Parallelogramm,Trapez
[C#] Bruch-Klasse
[VB.NET] einfacher rekursiver Mathe Parser
[VB.NET] Permutation nachweisen
[VB.NET] Größter gemeinsamer Teiler
[VB.NET] Fibonacci-Folge iterativ erzeugen
[VB.NET] Binomialkoeffizient
[VB.NET] Zahlen Addition als Spam Schutz

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.