Dualzahlen mit Visual Basic .NET verwenden

Veröffentlicht: 10. Jan 2005

Von Mathias Schiffer

Auch in der Version Visual Basic .NET 2003 kann VB noch nicht direkt mit Dualzahlen umgehen. In diesem Artikel lernen Sie außerdem die neuen binären VB.NET-Operatoren >> und << kennen.

Leider ist auch Visual Basic .NET noch immer nicht in der Lage, direkt mit Dualzahlen umzugehen. Im einfachsten Fall bietet sich daher an, darzustellende Dualzahlen als Strings zu repräsentieren (wird keine Ausgabe benötigt, bieten sich andere Varianten an).

Immerhin hat Visual Basic .NET mit der Version 2003 zusätzlich zu den bisherigen binären Operatoren (z.B. And, Or und Not) weitere Möglichkeiten erhalten: Die neuen binären „Bit Shift“-Operatoren << und >> verschieben die Bits eines Binärwerts jeweils nach links (in Richtung MSB = „Most Significant Bit“) oder nach rechts (in Richtung LSB = „Least Significant Bit“). Dabei wird den Operatoren als Argument angegeben, um wie viele Bits die Verschiebung stattfinden soll. Bits, die aus dem gültigen Bereich „herausgeschoben“ werden, entfallen dabei: Ihre Ersatzbits auf der jeweils anderen Seite werden immer auf 0 gesetzt. Ein zyklisches Verschieben der Bits wird also nicht angeboten. Der Vollständigkeit halber sei noch hingewiesen auf die zugehörigen Zuweisungsoperatoren >>= und <<=, die häufige Konstruktionen wie „x = x << z“ vereinfachen.

Diese Operatoren eröffnen eine neue Möglichkeit, Dualzahl-Strings in Zahlenwerte umzuwandeln: So können Sie einfach einen leeren Wert als Zahlenergebnis zur Verfügung stellen und dessen Bits dann, Zeichen für Zeichen des Dualzahlenstrings, nach links verschieben. Am Ende des Strings steht der gesuchte Dezimalwert in der Ergebnisvariablen zur Verfügung:

  Public Function ToNumber(ByVal Dual As String) As Integer
    ' Liefert für eine als String (gültige Zeichen "0" und "1")
    ' übergebene positive Dualzahl ohne Nachkommastellen deren
    ' numerischen Wert zurück.
  
    ' Übergabestring bereinigen
    Dual = Replace(Dual, " ", vbNullString)
  
    ' Bereinigten Übergabestring prüfen: Nur 0 und 1 zulassen
    If Replace(Replace(Dual, "1", vbNullString), _
                       "0", vbNullString).Length > 0 Then
      Exit Function
    End If
  
    ' Berechnung ausführen:
  
    ' Ergebniswert zur Verfügung stellen (Startwert 0)
    Dim iNumber As Integer
  
    ' Jedes Zeichen abprüfen
    For i As Integer = 0 To Dual.Length - 1
      ' Bitshift des Ergebniswerts nach links, 0/1 addieren
      iNumber = (iNumber << 1) + Integer.Parse(Dual.Substring(i, 1))
    Next
  
    ' Berechneten Wert zurückgeben
    Return iNumber
  
  End Function

Natürlich können Sie einen vergleichbaren Weg rückwärts beschreiten, um aus einer Dezimalzahl einen Dualzahlstring zu erzeugen. An dieser Stelle sparen wir uns das, das obige Beispiel mag zur Vorstellung der neuen binären Operatoren ausreichen.

Schließlich machen wir es uns als Programmierer doch gerne so einfach wie möglich. Wie praktisch, dass uns das .NET Framework dabei voll unterstützt:

Dualzahlen als Strings per System.Convert

Das .NET Framework macht uns die Arbeit noch einfacher: Die Funktion ToString der Klasse System.Convert erlaubt in einer ihrer 26 Überladungen für Zahlen die Angabe einer Zahlensystembasis! So vereinfacht sich die Aufgabe radikal zu einem Einzeiler:

  Public Function ToBinary(ByVal Number As Integer) As String
    ' Liefert eine String-Dualzahldarstellung des
    ' übergebenen Integerwerts zurück
  
    Return Convert.ToString(Number, 2)
  
  End Function

Auch für den weiter oben dargestellten umgekehrten Weg findet sich in der Funktion System.Convert.ToInt32 eine viel einfachere Möglichkeit für unser Ansinnen:

  Public Function ToNumber(ByVal Dual As String) As Integer
    ' Liefert für eine als String (gültige Zeichen "0" und "1")
    ' übergebene positive Dualzahl ohne Nachkommastellen deren
    ' numerischen Wert zurück.
  
    ' Übergabestring bereinigen
    Dual = Replace(Dual, " ", vbNullString)
  
    ' Bereinigten Übergabestring prüfen: Nur 0 und 1 zulassen
    If Replace(Replace(Dual, "1", vbNullString), _
                       "0", vbNullString).Length > 0 Then
      Exit Function
    End If

    ' Die Berechnungsarbeit überlassen wir Convert.ToInt32:
    Return Convert.ToInt32(Dual, 2)
  
  End Function

Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.