Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0230: Dezimalzahl in Binärestring wandeln

 von 

Beschreibung 

Recht einfach erfolgt das Umwandeln von Dezimalzahlen in Binäre.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,02 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Beschriftungsfeld "Label1"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label2"

Option Explicit

Private Sub Command1_Click()
    Label1.Caption = DezBin(Text1.Text)
End Sub

Private Function DezBin(Dez) As String
    Dim x As Integer

   If Dez >= 2 ^ 32 Then
        Call MsgBox("Zahl ist größer als 32 Bit")
        Exit Function
   End If

   Do
        If (Dez And 2 ^ x) Then
            DezBin = "1" & DezBin
        Else
            DezBin = "0" & DezBin
        End If
        
        x = x + 1
    Loop Until 2 ^ x > Dez
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 10 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Jochen Wierum am 02.10.2006 um 20:05

Hallo vegaS,

Die VB-Hilfe erklärt es:

"Variablen vom Datentyp Long (lange Ganzzahl) werden als 32-Bit-Zahlen (4 Bytes) mit Vorzeichen im Bereich von -2.147.483.648 bis 2.147.483.647 gespeichert."

2^32 ist zwar 4294967295, aber Long ist halt "signed". Daher verursacht 4294967295 einen Überlauf, wenn VB versucht, die Zahl als Long zu betrachten.

Wenn ich es richtig sehe, gehen die anderen Lösungen allerdings auch mit negativen Zahlen nicht korrekt um.

Mit freundlichen Grüßen
Jochen Wierum

Kommentar von vegaS am 29.09.2006 um 09:42

4294967295 ist 32Bit Zahl.
Alle Funktionen unten wollen angeblich mit 32Bit Zahlen umgehen (2^31). Keine wandelt die Zahl aber richtig in 11111111111111111111111111111111 um. :-((

Private Function DezBin(Dez As Currency) As String
Dim x As Integer

If Dez >= 2 ^ 32 Then
Call MsgBox("Zahl ist größer als 32 Bit")
DezBin = ""
Exit Function
End If

If Dez >= 2 ^ 31 Then
DezBin = "1"
Dez = Dez - 2 ^ 31
Else
DezBin = "0"
End If

For x = 30 To 0 Step -1
DezBin = DezBin & IIf(Dez And 2 ^ x, "1", "0")
Next x
End Function


Oder man schiebt die Zahl (dann ein Long!) mit MemCopy in ein vier-Byte-Array und wandelt diese Bytes einzeln um.

Kommentar von FaDLW am 08.11.2004 um 12:09

Hier noch eine schöne Rekrusive Lösung:

Private Function Dez2Bin(ByVal Zahl As Integer) As String
If Zahl > 1 Then Dez2Bin = Dez2Bin & Dez2Bin(Zahl \ 2)
Dez2Bin = Dez2Bin & (Zahl Mod 2)
End Function

Kommentar von Puri am 29.11.2003 um 16:06

Warum einfach wenns umständlich auch geht? Die Funktion arbeitet etwas eleganter als die seitenlange unten:

Public Function dez2ZKbin(zahl As Long) As String
Dim i As Long
Dim j As Long
For i = 0 To 31
If i < 31 Then
j = 2 ^ i
Else
j = -2147483648#
End If
If (zahl And j) = j Then
dez2ZKbin = "1" & dez2ZKbin
Else
dez2ZKbin = "0" & dez2ZKbin
End If
Next i
End Function

Kommentar von Puri am 18.11.2003 um 04:52

Die Funktion "dez2ip" ist natürlich vollkommen überflüssig für die Konvertierung und kann einfach weggelassen werden - aber zur Info: Sie wandelt eine IP-Adresse die als ganze 32-Bit Zahl vorliegt in die IP-Adresse als String (jeweils 8-Bit-Blöcke).
Z.B. wird aus 1098900436 die IP-Adresse: 212.227.127.65

Kommentar von Puri am 18.11.2003 um 04:41

Diese Funktion wandelt auch negative Zahlen richtig in die Zweierkomplementdarstellung um:

Function dez2ip(Dez As Long) As String
Dim i As Long
Dim sDez As String
sDez = ZKDez2Bin(Dez)
For i = 1 To 32 Step 8
dez2ip = bin2dez(Mid$(sDez, i, 8)) & "." & dez2ip
Next i
dez2ip = Mid$(dez2ip, 1, Len(dez2ip) - 1)
End Function

' Umrechnen einer signed 32-Bit Dezimalzahl in die
' binäre Zweierkomplementdarstellung
Private Function ZKDez2Bin(Dez As Long) As String
Dim x%, ZKDez2Bintemp$
Dim temp As Long
Dim minus As Boolean

If Dez >= 2 ^ 32 Then
Exit Function
End If

If Dez < 0 Then
minus = True
Dez = Abs(Dez)
End If

Do
If (Dez And 2 ^ x) Then
If Not minus Then
ZKDez2Bin = "1" & ZKDez2Bin
Else
ZKDez2Bin = "0" & ZKDez2Bin
End If
Else
If Not minus Then
ZKDez2Bin = "0" & ZKDez2Bin
Else
ZKDez2Bin = "1" & ZKDez2Bin
End If
End If
x = x + 1
Loop Until 2 ^ x > Dez

If minus Then
For x = 31 To Len(ZKDez2Bin) + 1 Step -1
ZKDez2Bin = "1" & ZKDez2Bin
Next x
temp = bin2dez(ZKDez2Bin) + 1
ZKDez2Bin = ZKDez2Bin(temp)
ZKDez2Bintemp = "1"
For x = 31 To Len(ZKDez2Bin) + 1 Step -1
ZKDez2Bintemp = ZKDez2Bintemp & "0"
Next x
ZKDez2Bin = ZKDez2Bintemp & ZKDez2Bin
Else
For x = 32 To Len(ZKDez2Bin) + 1 Step -1
ZKDez2Bintemp = ZKDez2Bintemp & "0"
Next x
ZKDez2Bin = ZKDez2Bintemp & ZKDez2Bin
End If

End Function

Private Function bin2dez(bin As String) As Long
Dim i As Long
Dim j As Long
j = 0
For i = Len(bin) To 1 Step -1
If Mid$(bin, i, 1) = "1" Then
bin2dez = bin2dez + 2 ^ j
End If
j = j + 1
Next i
End Function

Kommentar von Oliver am 26.09.2003 um 13:00

Die Umwandlung Dez-Bin ist soweit klar. Ich bräuchte jedoch ein Programm, welches nicht nur mit Zahlen < 2^32 arbeiten kann, sonder bis zu 30 oder 40 Stellen Dezimal.
Hat jemand eine Ahnung, wie man so etzwas lösen könnte??
Bin für jeden Tip dankbar!
Oli

Kommentar von claudia am 08.09.2001 um 02:54

naturlich hat's wieder das textformat verhaut - leider nicht mehr so leicht leserbar!

Kommentar von claudia am 08.09.2001 um 02:50

ich weiss nicht ob's den fragensteller noch interessiert, aber sonst vielleicht jemand andern - erklaerungsversuch ohne anspruch auf richtig- und vollstaendigkeit (programmiere noch nicht sehr lange):
es wird binaer verglichen, das heisst die variable "dez" als binaerzahl mit dem "2^x" (heisst uebrigens 2 hoch x) ebenfalls als binaerzahl.
z.b. dez = 123 ist binaer 01111011 (das ist ein byte - 8 bit);
jedes bit von rechts nach links (obwohl's computerintern dann wieder verkehrt herum abgespeichtert wird, glaub ich, aber rechts-links ist die eigentliche leseweise) repraesentiert das vorhandensein(1) bzw nichtvorhandensein(0) von 2^x (von rechts nach links also 128, 64, 32, 16, 8, 4, 2, 1) in dieser zahl.
1 x 1 = 1
1 x 2 = 2
0 x 4 = 0
1 x 8 = 8
1 x 16 = 16
1 x 32 = 32
1 x 64 = 64
0 x 128 = 0
-------------
123
binaer vergleichen heisst dass jedes bit der einen zahl mit dem entsprechenden (gleich positionierten) bit der anderen zahl verglichen wird; das ergebnis dieses vergleiches ist dann wieder eine binaerzahl und haengt davon ab, ob man mit AND, OR ... vergleicht.
bei AND (wie im beispiel) wird in der ergebniszahl ein bit nur dann gesetzt (auf 1), wenn dieses bit in beiden vergleichszahlen gesetzt ist, ist's nur in einer gesetzt bleibt das ergebnisbit 0.
auf diese weise kann man dann leicht pruefen, ob ein bestimmtes bit in einer zahl gesetzt ist, indem man den wert dieses bits mit der gewuenschten zahl ANDet:
01111011 - 123 01111011 - 123 01111011 - 123
AND 00000001 - 2^0=1 00000010 - 2^1=2 00000100 - 2^2=4
-------- -------- --------
00000001 - 1 - TRUE 00000010 - 2 - TRUE 00000000 - 0 - FALSE
heraus kommt der wert dieses bits wenn ja, 0 wenn nein; vb uebersetzt 0 zu FALSE und jeden anderen wert zu TRUE - und damit ist die abfrage fertig:
If (Dez And 2^x) = TRUE/FALSE Then ...
heisst soviel wie:
"wenn in der zu pruefenden zahl Dez bit nr 1, welches den wert 1 (2^0) hat, gesetzt ist, dann schreib in die ergebnisvariable DezBin "1", sonst "0";
schleif nach oben (bit nr 2 - wert 2^1=2, bit nr 3 - wert 2^2=4, bit nr 4 - wert 2^3=8 ...) bis der wert nicht mehr enthalten sein kann".
falls was falsch oder so ist, bitte melden - danke.
viele gruesse, claudia

Kommentar von Eik am 19.07.2001 um 10:03

Hi ich bin noch VB Anfänger und habe die Funktion in mein Programm zur Umwandung von Dezimal nach Binär eingebaut. Sie funktioniert auch sehr gut.
Ich würde mich freuen wenn mir jemand die Funktionsweise von (Dez And 2 ^ x) erklären kann.
Es wird der Inhalt der Variablen Dez mit 2^x verglichen, aber welches Ergebnis kommt dabei zustande und wie wird verglichen ?