Binär, Oktal und Hexadezimal (auch bekannt als Hex) sind verschiedene Zahlensysteme mit unterschiedlichen Basen. Binär hat die Basis 2, Oktal die Basis 8 und Hexadezimal die Basis 16. Normale Ganzzahlen haben in Python die Basis 10. Binär, Oktal und Hexadezimal sind alles Darstellungen von Ganzzahlen. Das heißt, sie stellen positive und negative Zahlen (einschließlich null) ohne Brüche oder Dezimalstellen dar und unterstützen alle Operationen, die wir mit Ganzzahlen durchführen können.
Binär ist ein Zahlensystem mit der Basis 2, das nur die Ziffern 0 und 1 verwendet. Es stellt üblicherweise die Zustände 0 („aus") und 1 („an") des elektrischen Flusses durch Transistoren und Schalter in Computern dar, ebenso wie die positiven und negativen Ladungen in magnetischen Speichermedien. Binär kann alle Ganzzahlen darstellen, die in der Basis 10 verwendet werden.
Ein Ausschnitt aus dem System zur Basis 2 sieht so aus, obwohl es unendlich weitergeht und nicht bei 128 aufhört:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 2 ** 7 | 2 ** 6 | 2 ** 5 | 2 ** 4 | 2 ** 3 | 2 ** 2 | 2 ** 1 | 2 ** 0 |
Wenn wir also die Zahl 6 in Binär darstellen wollen, wäre das 110.
| Stellenwert | 4 | 2 | 1 |
|---|---|---|---|
| Binärzahl | 1 | 1 | 0 |
Und die Rechnung wäre: 4 + 2 + 0 = 6
Ein weiteres Beispiel: 19
| Stellenwert | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Binärzahl | 1 | 0 | 0 | 1 | 1 |
Die Binärzahl wäre: 10011
Und die Rechnung wäre: 16 + 0 + 0 + 2 + 1 = 19
In Python können wir binäre Literale mit dem Präfix 0b darstellen.
Wenn wir 0b10011 schreiben, interpretiert Python es als Binärzahl und wandelt es in die Basis 10 um.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
Binär ist in Python nur eine andere Art, eine Ganzzahl zu schreiben, und daher ist die binäre Darstellung eine Ganzzahl für alle mathematischen Operationen.
Wenn du eine Zahl mit dem Präfix 0b schreibst, die nicht im Binärsystem ist, wird ein SyntaxError ausgelöst.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
Da Binärzahlen Ganzzahlen sind, können wir mit ihnen alle Operationen durchführen, die wir auch mit Ganzzahlen durchführen können.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
Wir können Operationen auch zwischen binären und ganzzahligen Darstellungen durchführen.
Es gelten jedoch die üblichen mathematischen Operatorregeln: Die Division zweier Binärzahlen oder Ganzzahlen gibt eine float zurück, auch wenn die Division keinen Dezimalanteil ergibt.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
Python wandelt ein binäres Literal automatisch in int um.
Um einen int in eine binäre Darstellung umzuwandeln, verwendest du die eingebaute Funktion [bin()][bin].
bin() gibt einen str des binären Äquivalents mit dem Präfix 0b zurück.
>>> bin(19)
'0b10011'
Um ein binäres Literal in eine Ganzzahl umzuwandeln, können wir die eingebaute Funktion int() verwenden und einen String der binären Darstellung sowie ein Basis-Argument übergeben:
>>> int("0b10011", 2)
19
Wenn du die falsche Basis angibst (oder eine ungültige binäre Darstellung), wird ein ValueError ausgelöst:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
Es gibt auch einige spezielle Methoden, die wir auf Binärzahlen anwenden können.
<int>.bit_length() gibt die Anzahl der Bits zurück, die benötigt werden, um die Zahl darzustellen:
>>> 0b11011.bit_length()
5
<int>.bit_count() gibt die Anzahl der Einsen in der Binärzahl zurück.
Zum Beispiel gibt bit_count() für '0b11011' den Wert 4 zurück:
>>> 0b11011.bit_count()
4
Wenn du lokal arbeitest, benötigt bit_count() mindestens Python 3.10.
Der Exercism-Online-Editor unterstützt derzeit alle Funktionen bis Python 3.11.
Oktal ist ein Zahlensystem mit der Basis 8. Es verwendet die Ziffern 0, 1, 2, 3, 4, 5, 6 und 7.
In Python können wir Oktalzahlen mit dem Präfix 0o darstellen.
Wie bei Binär wandelt Python eine Oktaldarstellung automatisch in einen int um.
>>> 0o123
83
Wie bei Binär sind Oktalzahlen Ganzzahlen und unterstützen alle Ganzzahloperationen.
Wenn du einer Zahl, die nicht im Oktalsystem ist, das Präfix 0o voranstellst, wird ein SyntaxError ausgelöst.
Um einen int in eine Oktaldarstellung umzuwandeln, kannst du die eingebaute Funktion [oct()][oct] verwenden.
Sie funktioniert ähnlich wie die Funktion bin() und gibt einen String zurück:
>>> oct(83)
'0o123'
Um eine Oktalzahl in eine Ganzzahl umzuwandeln, können wir die Funktion int() verwenden und eine String-Darstellung im Oktalsystem sowie die Basis (8) als Argumente übergeben:
>>> int("0o123", 8)
83
Wie bei Binär wird ein ValueError ausgelöst, wenn du die falsche Basis angibst.
Hexadezimal ist ein Zahlensystem mit der Basis 16. Es verwendet die Ziffern 0 bis 9 und die Buchstaben A, B, C, D, E und F. A ist 10, B ist 11, C ist 12, D ist 13, E ist 14 und F ist 15.
Wir können Hexadezimalzahlen in Python mit dem Präfix 0x darstellen.
Wie bei Binär und Oktal wandelt Python hexadezimale Literale automatisch in int um.
>>> 0x123
291
Wie bei Binär und Oktal sind hexadezimale Literale Ganzzahlen, und du kannst mit ihnen alle Ganzzahloperationen durchführen.
Wenn du einer Zahl, die nicht hexadezimal ist, das Präfix 0x voranstellst, wird ein SyntaxError ausgelöst.
Um einen int in eine hexadezimale Darstellung umzuwandeln, kannst du die eingebaute Funktion [hex()][hex] verwenden.
Sie funktioniert ähnlich wie die Funktion bin() und gibt einen String zurück:
>>> hex(291)
'0x123'
Um eine hexadezimale Darstellung in eine Ganzzahl umzuwandeln, können wir die Funktion int() verwenden und einen hexadezimalen String sowie die Basis (16) als Argumente übergeben:
>>> int("0x123", 16)
291
Wie bei Binär und Oktal wird ein ValueError ausgelöst, wenn du die falsche Basis angibst.