Tipp 054: Umrechnung/Umwandlung Binär- bzw. Dualsystem zu Dezimal und vice versa
Autor: Alexander Kopatz VB-Version: Visual Basic 6.0 Download: Beispielprojekt Tipp-054
Beschreibung
Das Binärsystem ist für die heutige Informatik von essentieller Bedeutung. Computer arbeiten mit Spannungen und Transistoren diese kennen im wesentliche zwei Zustände Spannung (HIGH oder 1) oder keine Spannung (LOW oder 0). Daher bildet das Dualsystem, also ein Stellenwertsystem zur Basis 2, die Grundlage nahezu jeder aktuellen Informationstechnologie.
Die heutigen hochentwickelten Programmiersprachen ersparen an vielen Stellen einen Rückgriff auf die binären Daten des Rechnersystems. In vielen Fällen ist es jedoch sehr hilfreich oder schlicht notwendig direkt mit den Binärwerten einer Datenfolge zu operieren. So werden bspw. sämtliche Ziffern und Buchstaben dieses Artikels auf der Festplatte oder im Arbeitsspeicher Binär hinterlegt.
Dual- bzw. Binärsystem
Das Dualsystem arbeitet anders als das im Alltag gebräuchliche Dezimalsystem nicht mit der Basis 10 sondern mit der Basis 2. Dies bedeutet für jeder Position (n) im Dualsystem lässt sich dessen Wertigkeit mit der Formel 2^n berechnen. Zur Veranschaulichung hier die Ziffern 0 bis 10, sowie 25, 50, 99 und 100 des Dezimalsystems in Binärschreibweise. Die Gesamtsumme der einzelnen Wertigkeiten entspricht dann dem jeweiligen Zahlenwert.
Dezimal Binär
Position: 2 1 0 6 5 4 3 2 1 0
Wertigkeit: 100 10 1 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1
2 0 0 0 0 0 1 0
3 0 0 0 0 0 1 1
4 0 0 0 0 1 0 0
5 0 0 0 0 1 0 1
6 0 0 0 0 1 1 0
7 0 0 0 0 1 1 1
8 0 0 0 1 0 0 0
9 0 0 0 1 0 0 1
1 0 0 0 0 1 0 1 0
2 5 0 0 1 1 0 0 1
5 0 0 1 1 0 0 1 0
1 0 0 1 1 0 0 1 0 0
Umrechnung Binär zu Dezimal
Die Umrechnung eines Binärwertes in eine Dezimalzahl ist ohne Weiteres möglich. Da zu jeder Position die Wertigkeiten bekannt sind müssen lediglich die Wertigkeiten jeder einzelnen Position addiert werden um so die Gesamtsumme im Zehnersystem zu erhalten. Für die Zahl 9 in Binärschreibweise (1001) ergibt sich bspw. folgende Umrechnung:
1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3 = 9
1 * 1 + 0 * 2 + 0 * 4 + 1 * 8 = 9
1 + 0 + 0 + 8 = 9
In Programmcode ausgedrückt ließe sich diese Rechenoperation schematisch z.B. wie folgt lösen:
For Zähler = 0 To len(Binärzahl)
Ergebnis = Ergebnis + Wert_an_Position_Zähler * (2 ^ Zähler)
Next
Umrechnung Dezimal zu Binär
Die Umrechnung von der Dezimal- in die Binärschreibweise funktioniert ebenfalls Schrittweise. Der gesamte Zahlenwert wird durch 2 dividiert, ein ggf. überbleibender Rest wird entsprechend notiert, bleibt kein Rest so wird eine 0 notiert. Sodann wird der sich ergebendes Wert des Quotienten wieder durch zwei geteilt und der Rest notiert und so fort. Das Vorgehen sei hier anhand der Zahl 223 exemplarisch dargestellt:
223 : 2 = 111 Rest: 1
111 : 2 = 55 Rest: 1
55 : 2 = 27 Rest: 1
27 : 2 = 13 Rest: 1
13 : 2 = 6 Rest: 1
6 : 2 = 3 Rest: 0
3 : 2 = 1 Rest: 1
1 : 2 = 0 Rest: 1
Das Ergebnis lautet folglich: 11011111
Zur Umsetzung dieses Vorgangs in Software ist die Modulo Funktion sehr hilfreich, da Sie den Rest einer Division direkt zur Verfügung stellt. Hierdurch lässt sich eine Umwandlung mit wenigen Zeilen Code erreichen. Exemplarisch dargestellt ergibt sich folgende Funktion:
Do
Ergebnis = DezimalZahl Mod 2 & Ergebnis
DezimalZahl = DezimalZahl \ 2
Loop Until dblDezimal < 1
Im Anschluss finden Sie zudem ein Beispiel, welches die Umwandlung binär zu dezimal und umgekehrt demonstriert und dabei auch einige unzulässige Eingaben ausfiltert.
Zusatzinformationen
» Tipp 056: Umrechnung/Umwandlung Hexadezimal zu Dezimal
Quellcode
frmKonverter
Form frmKonverter
Label lblBinär
Label lblDezimal
TextBox txtBinär
' VISUAL BASIC WORLD
' ===========================================
' Das große Portal zum Thema Visual Basic.
'
' Wenn Ihnen dieser Source Code gefallen hat,
' dann empfehlen Sie Visual Basic World bitte
' weiter und/oder setzen Sie einen Link auf:
'
' http://www.visualbasicworld.de/
'
' Vernetzen Sie sich mit uns:
'
' http://twitter.com/visualbasicwrld
Option Explicit
Private bolUserEingabe As Boolean
Private Sub txtBinär_Change()
If bolUserEingabe Then
bolUserEingabe = False
If Not txtBinär.Text = "" Then
txtDezimal.Text = BinToDez(txtBinär.Text)
Else
txtDezimal.Text = BinToDez(0)
End If
End If
End Sub
Private Sub txtBinär_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 46 Then bolUserEingabe = True
End Sub
Private Sub txtBinär_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 127, 8, 48, 49
'ENTF-Taste
'Backspace-Taste
'0 und 1
Case Else
KeyAscii = 0
End Select
bolUserEingabe = True
End Sub
Private Sub txtDezimal_Change()
If bolUserEingabe Then
bolUserEingabe = False
If Not txtDezimal.Text = "" Then
txtBinär.Text = DezToBin(CDbl(txtDezimal.Text))
Else
txtBinär.Text = DezToBin(0)
End If
End If
End Sub
Private Sub txtDezimal_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 46 Then bolUserEingabe = True
End Sub
Private Sub txtDezimal_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 127, 8
'ENTF-Taste
'Backspace-Taste
Case Else
If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
If Len(txtDezimal.Text) >= 9 Then KeyAscii = 0
'Zu große (der Einfachheit halber, hier lange) Zahlern
'werden ausgefiltert um einen Überlauf zu verhindern.
End Select
bolUserEingabe = True
End Sub
modKonverter
' VISUAL BASIC WORLD
' ===========================================
' Das große Portal zum Thema Visual Basic.
'
' Wenn Ihnen dieser Source Code gefallen hat,
' dann empfehlen Sie Visual Basic World bitte
' weiter und/oder setzen Sie einen Link auf:
'
' http://www.visualbasicworld.de/
'
' Vernetzen Sie sich mit uns:
'
' http://twitter.com/visualbasicwrld
Option Explicit
Public Function DezToBin(ByVal dblDezimal As Double) As String
'=================================================================='
'= Fkt. wandelt eine Zahl aus dem Dezimal- in das Binärsystem um. ='
'=================================================================='
DezToBin = ""
Do
DezToBin = dblDezimal Mod 2 & DezToBin
dblDezimal = dblDezimal \ 2
Loop Until dblDezimal < 1
End Function
Public Function BinToDez(ByVal strBinär As String) As Double
'=================================================================='
'= Fkt. wandelt eine Zahl aus dem Binär- in das Dezimalsystem um. ='
'=================================================================='
Dim lngZähler As Long
Dim lngMax As Long
lngMax = Len(strBinär)
For lngZähler = 0 To (lngMax - 1)
BinToDez = BinToDez + _
CDbl(Mid$(strBinär, lngMax - (lngZähler), 1)) * (2 ^ lngZähler)
Next
End Function