Ziele
- Das Stellenwertsystem verstehen
- Dezimal → Binär mit dem Divisionsrest-Verfahren umsetzen
- Binär → Dezimal berechnen
- Die Umrechnung in Funktionen kapseln
Stellenwerte
Im Zehnersystem: 4827 = 4·1000 + 8·100 + 2·10 + 7·1. Im Zweiersystem gibt es nur die Ziffern 0 und 1, die Stellenwerte sind Zweierpotenzen: 1, 2, 4, 8, 16, 32, …
1011 (binär) = 1·8 + 0·4 + 1·2 + 1·1 = 11.
Binär → Dezimal
def bin_zu_dez(bits):
wert = 0
for ziffer in bits: # bits ist ein String wie "1011"
wert = wert * 2 + int(ziffer)
return wert
print(bin_zu_dez("1011"))
print(bin_zu_dez("11111111"))Erklärung
wert = wert * 2 + ziffer – dasselbe Muster wie „Zahl rückwärts" bei den Ziffern, nur mit Basis 2. Für "1011": 0 → 1 → 2 → 5 → 11.
Dezimal → Binär (Divisionsrest-Verfahren)
Teile die Zahl wiederholt durch 2 und notiere die Reste – von unten nach oben gelesen ergeben sie die Binärzahl.
11 : 2 = 5 Rest 1
5 : 2 = 2 Rest 1
2 : 2 = 1 Rest 0
1 : 2 = 0 Rest 1 -> von unten: 1011def dez_zu_bin(zahl):
if zahl == 0:
return "0"
bits = ""
while zahl > 0:
bits = str(zahl % 2) + bits # Rest vorne anfügen
zahl = zahl // 2
return bits
print(dez_zu_bin(11))
print(dez_zu_bin(255))Feste Bitbreite
Oft will man eine feste Länge (z. B. 8 Bit) mit führenden Nullen:
def dez_zu_bin(zahl, breite):
bits = ""
for _ in range(breite):
bits = str(zahl % 2) + bits
zahl = zahl // 2
return bits
print(dez_zu_bin(11, 8)) # 00001011
print(dez_zu_bin(200, 8))Aufgaben
Löse die folgenden Aufgaben selbstständig oder mit einem Partner oder Partnerin.
Aufgabe 1: Hin und zurück
Wandle eine Zahl nach binär und wieder zurück. Prüfe für viele Zahlen, dass das Original herauskommt.
def dez_zu_bin(zahl):
if zahl == 0:
return "0"
bits = ""
while zahl > 0:
bits = str(zahl % 2) + bits
zahl //= 2
return bits
def bin_zu_dez(bits):
w = 0
for z in bits:
w = w * 2 + int(z)
return w
# for n in range(0, 50): prüfe bin_zu_dez(dez_zu_bin(n)) == nAufgabe 2: Nötige Bitanzahl
Schreibe bits_noetig(zahl): die kleinste Bitbreite, in die zahl passt (z. B. 200 → 8, 300 → 9).
def bits_noetig(zahl):
anzahl = 1
grenze = 2
# while zahl >= grenze: ...
return anzahl
print(bits_noetig(200), bits_noetig(300))Aufgabe 3: Ins Hexadezimalsystem
Passe das Divisionsrest-Verfahren auf Basis 16 an. Für Reste 10–15 nutze die Buchstaben A–F.
ziffern = "0123456789ABCDEF"
def dez_zu_hex(zahl):
if zahl == 0:
return "0"
# bits = ziffern[zahl % 16] + bits ; zahl //= 16
pass
print(dez_zu_hex(255)) # FFTipp
Statt str(zahl % 16) nimmst du ziffern[zahl % 16] – so wird aus dem Rest 12 automatisch "C".