Du zählst und rechnest gewöhnlich im Dezimalsystem (Zehnersystem): Du kennst die zehn Ziffern 0 bis 9 – und du weisst, dass bei mehrstelligen Zahlen jede zusätzliche Stelle von rechts nach links zehn mal mehr wert ist.
Hier betrachten wir andere Zahlensysteme, insbesondere das Binärsystem und das Hexadezimalsystem.
Neben dem Zehnersystem könnten wir auch in Stellenwertsystemen mit anderer Basis zählen und rechnen – zum Beispiel im Oktalsystem mit Basis 8 oder im Vigesimalsystem mit der Basis 20. Das Binärsytem und das Hexadezimalsystem sind in der Informatik von besonderer Bedeutung:
1111
passt genau in die grösste einstellige Hexadezimalzahl F
(weil 16 ist eine 2er-Potenz ist: 24 = 16).Wir arbeiten vorwiegend mit dem Dossier Zahlensysteme.
binary_to_decimal(b)
, die den Binärstring b
in eine Dezimalzahl wandelt und diese zurückgibt. Beachte hierfür folgende Hinweise in den grünen Boxen. Notiere zuerst mit Kommentaren, wie du die Funktion aufbauen willst.Binärzahlen als Strings
„101“
entspricht der Dezimalzahl 5
.[
eckigen Klammern]
kannst auf einzelne Positionen im String zugreifen: Für text = „Hallo Welt“
gibt text[4]
das Zeichen „o“
.Binärzahlen in Dezimalzahlen umrechnen
2Stelle
:111
rechnen wir 22 + 21 + 20 = 4 + 2 + 1 = 7.1001
rechnen wir 23 + 20 = 8 + 1 = 9.Weitere Hinweise
„10110“
die Wertigkeit 24, also 16. Die nächste Stelle hat die Wertigkeit 8, dann 4 etc. Der Binärstring „10110“
entspricht also der Dezimalzahl 22 (16 + 4 + 2).int
wandelt ein Zeichen in die entsprechende Zahl, z. B. int('1') = 1
.decimal_to_binary(d)
, die die Dezimalzahl d
in einen Binärstring umrechnet und diesen zurückgibt.binary_add(a, b)
, die zwei gleich lange Binästrings a
und b
addiert und die Summe als Binärstring zurückgibt. Modulo
und Ganzzahldivision
lösen. Kopiere den Code unten und notiere erst mit #Kommentaren
hinter jede Zeile, welche beiden Zahlen ausgegeben werden. Führe dann aus.a
und b
Bit für Bit mit dem (bestehenden) Rest zusammenrechnen, um erstens die Summe für das aktuelle Bit und zweitens den Rest für das nächste Bit zu erhalten.print(3%2, 3//2) print(2%2, 2//2) print(1%2, 1//2) print(0%2, 0//2)
Du weisst, dass Computer und andere digitale Geräte Rechenmaschinen sind: Sie können unfassbar schnell rechnen. Aber wie? Die Einsen und Nullen speichert der Computer in Form elektrischer Ladungen – vereinfacht betrachtet: Ist in einer Speicherzelle eine Ladung, so bedeutet das eine Eins, sonst eine Null. Nehmen wir 8 Speicherzellen zusammen, so können wir darin eine 8-Bit-Binärzahl speichern. Angenommen, wir haben 8 Speicherzellen für Zahl A und weitere 8 Speicherzellen für Zahl B: Eine digitale Addiermaschine muss nun die Speicherzellen der Zahlen A und B so miteinander verbinden, dass sich daraus die Summe von A und B ergibt.
Wert Dezimal | Wert Binär | Hex-Nennwert | Merkhilfe |
---|---|---|---|
0 | 0000 | 0 | |
1 | 0001 | 1 | |
… | … | … | |
9 | 1001 | 9 | |
10 | 1010 | A | |
11 | 1011 | B | |
12 | 1100 | C | Cwölf |
13 | 1101 | D | Dreizehn |
14 | 1110 | E | |
15 | 1111 | F | Fünfzehn |
Alle Farben können durch Mischen der Grundfarben Rot, Grün, und Blau erzeugt werden.
Siehe Dossier Kapitel 5, Aufgaben D1 bis D3
Code-Variante mit While-Schleife, die Bitstring von links nach rechts durchgeht.
def binary_to_decimal(b): decimal = 0 stellenwert = 2**(len(b)-1) # Wert des höchtwertigen Bits berechnen i = 0 while i < len(b): if b[i] == '1': decimal = decimal + stellenwert stellenwert = stellenwert // 2 # Stellenwert halbieren für nächste Stelle i = i + 1 return decimal print(binary_to_decimal('100011'))
Kürzere Variante: Anstelle der if-Verzweigung können wir jeweils mit dem aktuellen Bit (0 oder 1) mutliplizieren – das Zeichen ('0' oder '1') muss hierzu mit der Funktion int
in die entsprechende Zahl gewandelt werden:
def binary_to_decimal(b): decimal = 0 stellenwert = 2**(len(b)-1) # Wert des höchtwertigen Bits berechnen i = 0 while i < len(b): decimal = decimal + int(b[i]) * stellenwert stellenwert = stellenwert // 2 # Stellenwert halbieren für nächste Stelle i = i + 1 return decimal print(binary_to_decimal('100011'))
Noch kürzere Variante: Anstatt den Stellenwert zu Beginn zu berechnen, können wir ihn in jedem Durchgang neu berechnen: Dabei rechnen wir: 2 hoch (Länge der Binärzahlzahl minus aktuelle Stelle minus 1): Also für das dritte Bit der Binärzahl 10101 rechnen wir 2 hoch (5-3-1), also 2 hoch 2 gleich 4: Das ist richtig, diese Stelle hat den Stellenwert 4.
def binary_to_decimal(b): decimal = 0 i = 0 while i < len(b): decimal = decimal + int(b[i]) * 2**(len(b)-i-1) i = i + 1 return decimal print(binary_to_decimal('100011'))
def decimal_to_binary(d): bstring = "" while d > 0: bstring = str(d % 2) + bstring # neue Ziffer vorne am String anfügen d = d // 2 return bstring print(decimal_to_binary(27))
Version ohne Anpassung ungleicher Längen:
def binary_add(a, b): resultat = "" i = len(a) - 1 rest = 0 while i >= 0: abit, bbit = int(a[i]), int(b[i]) summe = (abit + bbit + rest) % 2 rest = (abit + bbit + rest) // 2 resultat = str(summe) + resultat i = i - 1 if rest != 0: resultat = str(rest) + resultat return resultat print(binary_add('111', '011')) # 7 + 3 print(binary_add('001', '101')) # 1 + 5
Version mit Anpassung ungleicher Längen:
def binary_add(a, b): # Binärstrings gleich lang machen: maxlen = max(len(a), len(b)) a = a.zfill(maxlen) b = b.zfill(maxlen) resultat = "" i = maxlen - 1 rest = 0 while i >= 0: abit, bbit = int(a[i]), int(b[i]) summe = (abit + bbit + rest) % 2 rest = (abit + bbit + rest) // 2 resultat = str(summe) + resultat i = i - 1 if rest != 0: resultat = str(rest) + resultat return resultat print(binary_add('111', '11')) # 7 + 3 print(binary_add('1', '101')) # 1 + 5