Frage deutsch
~~~~~~~~~~~~~~
Wie wandle ich eine Dezimalzahl in eine Binärzahl und umgekehrt?
 

Question English
~~~~~~~~~~~~~~
How to convert a dezimal into a binary number and vice versa?
 

Antwort 1
~~~~~~~~~
[ von Thomas Antoni, 12.5.2002 - 26.6.2002 ]
.
Für die Konvertierung von Dezimal- in Binärzahlen und umgekehrt gibt es keine direkt verwendbaren QBasic-Befehle. Aber mit jeweils einer kleinen Rechenroutine ist die Umwandlung einfach zu erledigen.
Bei den folgenden Programmbeispielen wird vorausgesetzt, dass die Binärzahl im -> Dualcode vorliegt (siehe unter ->
Dualcode im LEXIKON). Ich zeige euch für jede Konvertierungsrichtung zwei Realisierungsmöglichkeiten. Die Beispielprogramme lassen sich jeweils mit <Strg + C> abbrechen.
 
*** Binär->Dezimal-Konvertierung
Diese beiden Programm-Varianten wandeln eine Binärzahl, die als Textstring im -> Dualcode vorliegt, in eine 32-Bit-Integer-Zahl um:
 

Variante 1
Diese sehr elegante und kurze Methode stammt von NicTheQuick (
NicolasG*web.de ):
 
 
'*********************************************************************
' BIN2DEC1.BAS = Zahlenkonvertierung Binär -> Dezimal
' ============
' Binaerzahl in Dezimalzahl wandeln
' (c) NicTheQuick (NicolasG*web.de)
'*********************************************************************
DO
CLS
PRINT "Gib die Binaerzahl ein (max 31 Bits):"
INPUT "Binaer : ", Binaer$
Dez& = 0
FOR x% = 1 TO LEN(Binaer$)
Dez& = Dez& + (VAL(MID$(Binaer$, x%, 1)) * 2 ^ (LEN(Binaer$) - x%))
NEXT x%
PRINT "Dezimal: "; Dez&
PRINT " <Wiederholen mit beliebiger Taste, Abbruch mit Esc>"
taste$ = INPUT$(1) 'Eine Taste von der Tastaur einlesen
IF taste$ = CHR$(27) THEN END
LOOP
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/bin2dec1.bas .
 

Variante 2
 
'*************************************************************
' BIN2DEC2.BAS = Binaerzahl in Dezimalzahl wandeln
' ============
'*************************************************************
PRINT "Gib eine aus Nullen und Einsen bestehende"
PRINT "Binaerzahl ein (max. 32 Bits)"
INPUT bin$
a& = 0
FOR n% = 1 TO LEN(bin$)
IF MID$(bin$, 1 + LEN(bin$) - n%, 1) = "1" THEN
a& = a& + 2 ^ (n% - 1)
END IF
NEXT n%
PRINT "die umgewandelte Zahl lautet"; a& '32 bit Double Word
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/progs/bin2dec2.bas .
 

Variante 3
 
'***********************************************************
' BIN2DEC3.BAS = Binaerzahl in Dezimalzahl wandeln
' ============
'***********************************************************
CLS
DO
INPUT "Gib die Binaerzahl ein oder q z.Abbrechen"; Binary$
IF Binary$ = "q" THEN END
decimal& = 0: power% = 0
Binary$ = UCASE$(Binary$)
FOR i% = LEN(Binary$) TO 1 STEP -1
digit% = ASC(MID$(Binary$, i%, 1)) - 48
IF digit% < 0 OR digit% > 1 THEN decimal& = 0: EXIT FOR
decimal& = decimal& + digit% * 2 ^ (power%)
power% = power% + 1
NEXT i%
PRINT decimal&
LOOP
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/progs/bin2dec3.bas .
 
*** Dezimal->Binär-Konvertierung
Diese beiden Programm-Varianten wandeln eine Dezimalzahl, die als 32- bzw. 16-Bit-Integer-Zahl vorliegt, in eine Binärzahl um, die als Textstring ausgegeben wird.
 

Variante 1
'***********************************************************
' DEC2BIN1.BAS = Zahlenkonvertierung Dezimal -> Binaer
'***********************************************************
DO
INPUT "Gib die Dezimalzahl ein.....: ", decimal&
Bin$ = ""
h$ = HEX$(decimal&)
FOR i% = 1 TO LEN(h$)
digit% = INSTR("0123456789ABCDEF", MID$(h$, i%, 1)) - 1
IF digit% < 0 THEN Bin$ = "": EXIT FOR
j% = 8: k% = 4
DO
Bin$ = Bin$ + RIGHT$(STR$((digit% \ j%) MOD 2), 1)
j% = j% - (j% \ 2): k% = k% - 1
IF k% = 0 THEN EXIT DO
LOOP WHILE j%
NEXT i%
PRINT "Die Binaerzahl lautet.......: "; Bin$
PRINT
PRINT "...Wiederholen mit belieb. Taste ...Beenden mit Esc"
PRINT
t$ = INPUT$(1) 'eine Taste einlesen
IF t$ = CHR$(27) THEN END 'beenden bei Esc-Taste
LOOP
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/dec2bin1.bas .
 
 

Variante 2
 
'****************************************************
'DEC2BIN2.BAS = Zahlenkonvertierung Dezimal -> Binaer
'****************************************************
DIM bin%(14) 'Feld zur Ablage der 15 Binaer-Bits
CLS
DO
PRINT "Gib die in den Dualcode zu wandelnde Dezimalzahl";
PRINT "ein (max 32767) oder -1 zum beenden:"
INPUT " ", zahl%
IF zahl% = -1 THEN END 'Programmabbruch mit -1
z% = 2 ^ 14
FOR x% = 0 TO 14
IF zahl% - z% >= 0 THEN
bin%(x%) = 1
zahl% = zahl% - z%
ELSE
bin%(x%) = 0
END IF
z% = z% / 2
NEXT
PRINT "Die Dualzahl lautet: "
FOR x% = 0 TO 14
PRINT bin%(x%);
NEXT
PRINT : PRINT
LOOP
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/dec2bin2.bas .
 
 
Die Dezimalzahl "zahl%" (hier eine Integer-Zahl, nur positive Werte 0-32768 = 15 Bits) wird in eine Binärzahl umgewandelt und im Feld "bin&()" gespeichert. Danach wird das Feld ausgelesen und auf den Bildschirm ausgegeben (Programmidee von Carlo Teubner).
Man kann dies Programm vereinfachen, indem man die Binärzahl direkt als String aufbaut. Das sieht dann so aus:
 
'***************************************************
' DEC2BIN3.BAS - Dezimalzahl in Binaerzahl wandeln
' ============
'***************************************************
CLS
DO
bin$ = ""
PRINT "Gib die in den Dualcode zu wandelnde ";
PRINT "Dezimalzahl ein"
PRINT "(max 32767, 0 zum Beenden): "
INPUT zahl%
IF zahl% = 0 THEN END'Beenden bei "0"
z% = 2 ^ 14
FOR x% = 0 TO 14
IF zahl% - z% >= 0 THEN
bin$ = bin$ + "1"
zahl% = zahl% - z%
ELSE
bin$ = bin$ + "0"
END IF
z% = z% / 2
NEXT
PRINT bin$
PRINT
LOOP
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/dec2bin3.bas .
 
Willst Du den Inhalt einer beliebigen Datei im Dualcode als Nullen und Einsen auf dem Bildschirm anzeigen, so findest Du dafür ein Beispielprogramm im Beitrag "Wie zeige ich eine Datei im Hex- oder im Dualcode an?" in der Rubrik "Dateien ... bearbeiten"
 
*** ... und was ist mit negativen Zahlen?
QBasic stellt negative Zahlen intern im -> Zweierkomplement dar . Wer mailt mir Programme an thomas*antonis.de , die auch negative Dezimalzahlen in Binärzahlen konvertieren können und umgekehrt?
 

Answer 2
~~~~~~~~
[ by Douggie Green ]
How To Convert A Number To Binary And Extract A Bit From It?

See below for a piece of code that illustrates how to do that .
 
'***********************************************************************
' DEC2BIN4.BAS = Zahlenkonvertierung Dezimal -> Binaer
' ============
' Dezimalzahl in Binaerzahl wandeln und ein Bit extrahieren
' Convert A Number To Binary And Extract A Bit From It
'***********************************************************************
DECLARE FUNCTION tobin$ (n%) ' integer to binary string
DECLARE FUNCTION todec% (n$) ' binary string to integer
DECLARE FUNCTION getbit% (btg%, n%) ' extract a bit from integer
' These three functions are result of very little work, and have probably
' been written by most programmers at some time, and then forgotten.
' Feel free to use, modify, or convert in any way :)
' (But don't blame me for any damage, whether physical, mental or
' emotional!)
'
CLS
num% = 0
'
DO
PRINT
INPUT "Decimal Number (Abort with 0) ", num%
IF num% = 0 THEN END
INPUT "Bit to get ", bittoget%
IF bittoget% > 0 THEN
bin$ = tobin$((num%))
PRINT "Binary Number is "; bin$
bit% = getbit%(bittoget%, num%)
PRINT "Getbit is "; bit%
dec% = todec%(bin$)
PRINT "Todec is "; dec%
END IF
LOOP WHILE num% > 0
END
'
FUNCTION getbit% (btg%, n%)
' return the value of a single bit ( 1/0 ) from a decimal value/variable
' btg% = the bit position to check
' n% = the decimal number to extract the bit from
IF (n% AND (2 ^ (btg% - 1))) > 0 THEN getbit% = 1
END FUNCTION
'
FUNCTION tobin$ (n%)
' convert an integer value into a binary string, e.g 4 becomes "100"
' nm% is the value to convert.
a$ = ""
'n% = nm%: ' needed because despite what Help says, num% will be changed
WHILE n% > 0
bit% = n% MOD 2
n% = INT(n% / 2)
a$ = RIGHT$(STR$(bit%), 1) + a$
WEND
tobin$ = a$
END FUNCTION
'
'
FUNCTION todec% (b$)
' convert a string of 1's and 0's into it's decimal equivilant
' could be tweaked for speed, but not a lot
'
FOR k% = LEN(b$) TO 1 STEP -1
IF MID$(b$, k%, 1) = "1" THEN d% = d% + (2 ^ (LEN(b$) - k%))
NEXT
todec% = d%
END FUNCTION
 
This programm is available in the Progs\ directory and online under www.antonis.de/faq/progs/dec2bin4.bas .
 
 

Answer 3
~~~~~~~~~~~~
[ from the QB-Forum at
www.network54.com/Forum/ ]
 
*** Problem
How to convert Decimal to Binary numbers?
 
*** Solution
This is all:
 
FUNCTION Bin$ (A)
FOR n = 0 TO 15
IF 2 ^ n = A - (A XOR 2 ^ n) THEN b$ = "1" + b$ ELSE b$ = "0" + b$
NEXT
Bin$ = b$
END FUNCTION
 
Or take this one:
 
defint a-z
FUNCTION Bin$ (A)
m = 1
'
FOR n = 0 TO 15
IF (a and m) = 0 THEN
b$ = "0" + b$
ELSE
b$ = "1" + b$
end if
m=m*2 'or m=m+m ... whatever you prefer
NEXT
'
Bin$ = b$
END FUNCTION
 
 
*** Problem
How to convert Decimal to Binary numbers?
 
*** Solution

DIM Num AS DOUBLE
CLS : PRINT "Just press enter to stop": DO: GOSUB Convert1: LOOP
Convert1:
INPUT "Number to convert to binary: ", n$: IF n$ = "" THEN SYSTEM
Num = VAL(n$)
n$ = STR$(Num)
IF INSTR(n$, "D+") > 0 THEN PRINT "Sorry, too big!": RETURN
IF INSTR(n$, ".") > 0 THEN PRINT "Integers only, please!": RETURN
IF Num = 0 THEN PRINT "Zero or non-Numeric detected": RETURN
IF Num > 0 THEN sign$ = "1" ELSE sign$ = "-1": Num = -Num
ans$ = ""
DO UNTIL Num = 1
Num = Num / 2
IF Num = INT(Num) THEN ans$ = "0" + ans$ ELSE Num = INT(Num): ans$ = "1" + ans$
LOOP
PRINT sign$; ans$
RETURN
 

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]