2.4.3. Zahlensysteme (S)#
Im letzten Abschnitt haben Sie zwei grundsätzlich verschiedene Konzepte kennengelernt, mit denen Zahlen als Bitfolgen dargestellt werden können:
BCD (Binary Coded Decimal) ist eine Codierung von Dezimalziffern.
Jede Ziffer 0–9 wird unabhängig von ihrem Stellenwert durch ein festes Bitmuster aus 4 Bit dargestellt.Die Binärdarstellung ist eine Stellenwertdarstellung zur Basis 2, also ein Zahlensystem, bei dem der Zahlenwert durch die Position der Ziffern bestimmt wird.
Beide Konzepte wurden verwendet, um ganze Zahlen als Bitfolgen darzustellen, beruhen jedoch auf unterschiedlichen Prinzipien:
Codierung bezeichnet eine feste Abbildung, die festlegt, welches Bitmuster für welches Symbol steht
(z. B. die Ziffer „7“ →0111im BCD).Ein Zahlensystem ist ein Stellenwertsystem, das definiert, wie ein Zahlenwert als Folge von Ziffern zur Basis b geschrieben und interpretiert wird
(z. B. Basis 2, 10 oder 16).
Abb. 2.9 Zahlensysteme ändern die Darstellung einer Zahl, nicht ihre Bedeutung. Codierung übersetzt die Darstellung in eine Bitfolge. Sonderfall: Bei der Binärdarstellung von natürlichen Zahlen fallen Ziffernfolge und Bitfolge zusammen. In der Regel sind Darstellung (Zahlensystem) und Bitfolge (=Ergebnis der Codierung) strikt getrennt!#
Wichtige Zahlensystem
Es gibt 3 Zahlensysteme, auf die Sie in der Praxis beim Programmieren stoßen können: das Dezimal-, das Binär- und das Hexadezimalsystem.
Die Zahl „dreizehn“ sieht in diesen drei Zahlensystemen wie folgt aus:
\(13\) im Dezimalsystem (Basis 10, Alltagsschreibweise)
\(1101\) im Binärsystem (Basis 2)
\(D\) im Hexadezimalsystem (Basis 16)
Als Programmierin sollten Sie die drei Zahlensysteme kennen, denn:
Debugger zeigen Speicheradressen oder Registerwerte eventuell in Hexadezimaldarstellung an,
Fehlermeldungen, Bitmasken oder Statusflags sind in binärer oder hexadezimaler Form,
in technische Dokumentationen können Werte in verschiedenen Zahlensystemen angeben sein.
Sie sollten in der Lage sein Zahlensysteme zu verstehen und sicher zwischen Darstellungen wechseln zu können. Es geht darum Darstellungen korrekt zu erkennen, einzuordnen und bei Bedarf nachvollziehen zu können.
In Python können Sie Zahlen über format unterschiedlich darstellen:
# Hexadezimal → Integer (Binär ist nur eine Schreibweise!)
zahl_1 = 0x2A # Hexadezimale Darstellung
print(zahl_1) # 42 -> "0x2A" entspricht 42 in dezimal!
print(format(zahl_1, "b")) # 101010, b -> "bytes"
# Binär → Integer
zahl_2 = 0b101010 # Binäre Darstellung
print(zahl_2) # 42
# Dezimal → Integer
zahl_3 = 255 # Dezimale Darstellung
print(zahl_3) # 255
print(format(zahl_3, "x")) # ff, x -> hexadezimal
print(format(zahl_3, "#x")) # 0xff
42
101010
42
255
ff
0xff
Die folgende Tabelle zeigt die wichtigsten Zahlen:
for n in [0, 1, 10, 42, 255]:
print(f"{n:>3} {n:08b} 0x{n:02X}")
0 00000000 0x00
1 00000001 0x01
10 00001010 0x0A
42 00101010 0x2A
255 11111111 0xFF
Spezialfall: Natürliche Zahlen
Der Spezialfall ist in Abb. 2.9 dargestellt: Für natürliche Zahlen kann man „Zahlen direkt als Bits darstellen“.
Für alles andere (Zahlen mit Nachkommastellen, Text, … ) braucht man eine Codierung!
Für jede Umrechnung zwischen Zahlensystemen gibt es einen Algorithmus – eine feste Rechenvorschrift, die man lernt und dann anwendet.
Die Algorithmen können sie sich wie Kochrezepte vorstellen: Man muss sie nicht erfinden, sondern kennen und anwenden.
2.4.3.1. Beispiel: Binär → Dezimal#
Gegeben: Binärzahl \(1101_2\) (nur 0 und 1)
Gewollt: Dezimalzahl (das, was wir im Alltag benutzen)
Algorithmus:
Die Stellen werden von rechts beginnend nummeriert (rechts: Index 0, dann 1, 2, …).
Bei \(1101_2\):
\[\begin{split}\begin{array}{cccc} 1 & 1 & 0 & 1 \\ 3 & 2 & 1 & 0 \quad \text{(Index } i \text{)} \end{array}\end{split}\]Stelle \(i\) hat die Stellenwertigkeit \(2^i\) (also \(2^0=1\), \(2^1=2\), \(2^2=4\), …).
Bei \(1101_2\):
\[\begin{split}\begin{array}{cccc} 1 & 1 & 0 & 1 \\ 8 & 4 & 2 & 1 \quad (2^3, 2^2, 2^1, 2^0) \end{array}\end{split}\]Für jede Ziffer: Ziffer \(\times\) Stellenwertigkeit; alle Produkte addieren.
Bei \(1101_2\): \(1 \cdot 8 + 1 \cdot 4 + 0 \cdot 2 + 1 \cdot 1 = 8 + 4 + 0 + 1 = 13_{10}\)
Ergebnis: \(1101_2 = 13_{10}\)
In 32-zahlensysteme.md üben Sie, zwischen Dezimal-, Binär- und Hexadezimaldarstellung umzurechnen und die Notation sicher zu verwenden. Es ist kein Hexenwerk – Sie wenden einfach nur die Rezepte an.