Python kann mit Zahlen und Zeichenketten als Binär-, Oktal- und Hexadezimalzahlen sowie mit den üblichen Dezimalzahlen umgehen. Es ist auch einfach, zwischen ihnen zu konvertieren.
In diesem Abschnitt werden die folgenden Inhalte zusammen mit einem Beispielcode erläutert.
- Schreiben Sie ganze Zahlen in binärer, oktaler und hexadezimaler Form.
- Konvertieren von Zahlen in Zeichenfolgen in binärer, oktaler und hexadezimaler Notation.
- eingebaute Funktion (z.B. in einer Programmiersprache)
bin()
,oct()
,hex()
- String-Methode
str.format()
, Eingebaute Funktionenformat()
, f Zeichenfolge - Konvertiert eine negative Ganzzahl in eine Zeichenkette im Zweierkomplementformat.
- eingebaute Funktion (z.B. in einer Programmiersprache)
- Konvertiert Zeichenketten in binärer, oktaler und hexadezimaler Notation in Zahlen.
- eingebaute Funktion (z.B. in einer Programmiersprache)
int()
- eingebaute Funktion (z.B. in einer Programmiersprache)
- Anwendungsbeispiele
- Binäre String-Arithmetik
- Konvertieren zwischen Binär-, Oktal- und Hexadezimalzahlen
Schreiben Sie ganze Zahlen in binärer, oktaler und hexadezimaler Form.
Durch Hinzufügen der folgenden Präfixe können Ganzzahlen in binärer, oktaler bzw. hexadezimaler Form geschrieben werden.
Sie können auch Großbuchstaben verwenden.
- Binäre Zahl:
0b
oder0B
- Oktal:
0o
oder0O
- Hexadezimale Zahl:
0x
oder0X
Die Ausgabe von print() erfolgt in dezimaler Schreibweise.
bin_num = 0b10
oct_num = 0o10
hex_num = 0x10
print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16
Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10
print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16
Trotz des Präfixes ist der Typ eine Ganzzahl int.
print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
Da es sich um einen Ganzzahlentyp handelt, kann er für reguläre arithmetische Operationen verwendet werden.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
Ab Python 3.6 ist es möglich, Unterstriche _ in Zahlen einzufügen. Die Wiederholung eines Unterstrichs _ führt zu einem Fehler, aber Sie können so viele Unterstriche einfügen, wie Sie wollen, solange Sie sie nicht wiederholen.
Der Unterstrich _ hat keinen Einfluss auf die Zahl, so dass er bei vielen Ziffern als Trennzeichen verwendet werden kann. Wenn Sie zum Beispiel alle vier Ziffern einen Unterstrich _ einfügen, ist das leicht zu lesen.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Konvertieren von Zahlen in Zeichenfolgen in binärer, oktaler und hexadezimaler Notation.
Um eine Zahl in eine Zeichenkette in binärer, oktaler oder hexadezimaler Schreibweise umzuwandeln, verwenden Sie die folgenden eingebauten Funktionen.
- eingebaute Funktion (z.B. in einer Programmiersprache)
bin()
,oct()
,hex()
- String-Methode
str.format()
, Eingebaute Funktionenformat()
, f Zeichenfolge
In diesem Abschnitt wird auch erklärt, wie man eine Zeichenkette im Zweierkomplementformat für negative Werte erhält.
Eingebaute Funktionen bin(), oct(), hex()
Die folgenden eingebauten Funktionen können Zahlen in binäre, oktale und hexadezimale Zeichenfolgen umwandeln.
- Binäre Zahl:
bin()
- Oktal:
oct()
- Hexadezimale Zahl:
hex()
Jeder gibt eine Zeichenkette mit den folgenden Präfixen zurück
- Binäre Zahl:
0b
- Oktal:
0o
- Hexadezimale Zahl:
0x
- bin() — Built-in Functions — Python 3.10.0 Documentation
- oct() — Built-in Functions — Python 3.10.0 Documentation
- hex() — Built-in Functions — Python 3.10.0 Documentation
i = 255
print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff
print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Wenn Sie das Präfix nicht benötigen, verwenden Sie slice[2:], um die Zeichenkette dahinter zu extrahieren, oder verwenden Sie format(), wie im Folgenden erläutert.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Wenn Sie sie in eine dezimale Zeichenkette umwandeln wollen, können Sie str() verwenden.
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Eingebaute Funktion format(), string Methode str.format(), f string
Die eingebaute Funktion format() und die String-Methoden str.format() und f-string können auch Zahlen in binäre, oktale und hexadezimale Strings umwandeln.
Durch Angabe des zweiten Arguments von format() wie folgt kann es in binäre, oktale bzw. hexadezimale Zeichenfolgen umgewandelt werden.
- Binäre Zahl:
b
- Oktal:
o
- Hexadezimale Zahl:
x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff
print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Wenn Sie eine Zeichenkette mit dem Präfix 0b,0o,0x erhalten möchten, fügen Sie # an die Formatierungsangabe an.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
Es ist auch möglich, die 0 mit einer beliebigen Anzahl von Ziffern auszufüllen. Beachten Sie, dass die Anzahl der Zeichen für das Präfix (zwei Zeichen) ebenfalls berücksichtigt werden muss, wenn die Null mit einem Präfix aufgefüllt wird.
print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff
print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff
Die String-Methode str.format() kann ebenfalls zur Konvertierung verwendet werden.
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
Ab Python 3.6 können Sie auch die Zeichenkette f verwenden.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Konvertiert eine negative Ganzzahl in eine Zeichenkette im Zweierkomplementformat.
Wenn eine negative Ganzzahl mit bin() oder format() in eine binäre oder hexadezimale Zeichenkette umgewandelt wird, erhält der Absolutwert ein Minuszeichen.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
In Python werden bitweise Operationen mit negativen ganzen Zahlen auch in Zweierkomplement-Darstellung ausgeführt. Wenn Sie also eine Zeichenkette in Zweierkomplement-Darstellung erhalten möchten, können Sie ein bitweises logisches ODER& mit der maximal erforderlichen Anzahl von Bitziffern durchführen, wie folgt.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Konvertiert Zeichenketten in binärer, oktaler und hexadezimaler Notation in Zahlen.
Eingebaute Funktion int()
Um eine Zeichenkette in binärer, oktaler oder hexadezimaler Schreibweise in eine Zahl zu konvertieren, verwenden Sie die eingebaute Funktion int().
Mit int(string, radix) kann eine Zeichenkette str in binärer, oktaler, hexadezimaler Notation usw. in eine numerische int-Zahl auf der Grundlage des Radix konvertiert werden. Wird das Radix weggelassen, wird die Zahl als dezimal betrachtet.
print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16
print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>
Wenn das Radix auf 0 gesetzt ist, erfolgt die Konvertierung auf der Grundlage des folgenden String-Präfixes.
- Binäres Präfix:
0b
oder0B
- Oktalpräfix:
0o
oder0O
- Hexadezimales Präfix:
0x
oder0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16
print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16
Wenn die Basiszahl 0 ist und kein Präfix vorhanden ist, wird sie in eine Dezimalzahl umgewandelt, aber beachten Sie, dass ein Fehler auftritt, wenn der Anfang (die linke Seite) mit 0 gefüllt ist.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
In anderen Fällen können mit Nullen gefüllte Zeichenketten unverändert konvertiert werden.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Wenn die Zeichenkette nicht mit dem angegebenen Radix oder Präfix konvertiert werden kann, tritt ein Fehler auf.
# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'
# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'
# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'
Anwendungsbeispiele
Binäre String-Arithmetik
Zum Beispiel, um eine Operation an einer Zeichenkette in binärer Notation mit dem Präfix 0b durchzuführen.
Sie können ihn leicht in einen numerischen Wert (Ganzzahl vom Typ int) umwandeln, Operationen damit durchführen und ihn dann wieder in eine Zeichenkette str zurückwandeln.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Konvertieren zwischen Binär-, Oktal- und Hexadezimalzahlen
Es ist auch einfach, binäre, oktale und hexadezimale Zeichenketten ineinander umzuwandeln. Nach der Umwandlung in einen numerischen Wert kann dieser in eine Zeichenkette beliebigen Formats umgewandelt werden.
Das Auffüllen mit Nullen, das Voranstellen von Zeichen usw. kann durch die Formatierungsangabe gesteuert werden.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011