Wie drückt man binäre Literale in Python aus?


351

Wie drückt man eine Ganzzahl als Binärzahl mit Python-Literalen aus?

Ich konnte leicht die Antwort für hex finden:

>>> 0x12AF
4783
>>> 0x100
256

und oktal:

>>> 01267
695
>>> 0100
64

Wie verwenden Sie Literale, um Binärdateien in Python auszudrücken?


Zusammenfassung der Antworten

  • Python 2.5 und früher: Kann Binär mit, int('01010101111',2)aber nicht mit einem Literal ausdrücken .
  • Python 2.5 und früher: Es gibt keine Möglichkeit , binäre Literale auszudrücken.
  • Python 2.6 Beta: Sie können dies tun: 0b1100111oder 0B1100111.
  • Python 2.6 Beta: Ermöglicht auch 0o27oder 0O27(zweites Zeichen ist der Buchstabe O) die Darstellung eines Oktals.
  • Python 3.0 Beta: Wie 2.6, lässt jedoch die ältere 027Syntax für Oktale nicht mehr zu .

Antworten:


291

Als Referenz - zukünftige Python-Möglichkeiten:
Ab Python 2.6 können Sie binäre Literale mit dem Präfix 0b oder 0B ausdrücken :

>>> 0b101111
47

Sie können auch die neue Bin- Funktion verwenden, um die binäre Darstellung einer Zahl zu erhalten:

>>> bin(173)
'0b10101101'

Entwicklungsversion der Dokumentation: Was ist neu in Python 2.6?


72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

Ein anderer Weg.


2
Dies ist interessant, wenn Sie Zeichenfolgen haben. Wenn Sie jedoch mit reinen Zahlen arbeiten, fügen Sie dem Code unnötige Berechnungen hinzu.
Daniel Möller

28

Wie drückt man binäre Literale in Python aus?

Sie sind keine "binären" Literale, sondern "ganzzahlige Literale". Sie können ganzzahlige Literale mit einem Binärformat ausdrücken, 0gefolgt von einem Boder bgefolgt von einer Reihe von Nullen und Einsen, zum Beispiel:

>>> 0b0010101010
170
>>> 0B010101
21

In den Python 3- Dokumenten können Sie auf folgende Weise ganzzahlige Literale in Python bereitstellen:

Ganzzahlige Literale werden durch die folgenden lexikalischen Definitionen beschrieben:

integer      ::=  decinteger | bininteger | octinteger | hexinteger
decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
bininteger   ::=  "0" ("b" | "B") (["_"] bindigit)+
octinteger   ::=  "0" ("o" | "O") (["_"] octdigit)+
hexinteger   ::=  "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit ::=  "1"..."9"
digit        ::=  "0"..."9"
bindigit     ::=  "0" | "1"
octdigit     ::=  "0"..."7"
hexdigit     ::=  digit | "a"..."f" | "A"..."F"

Es gibt keine Begrenzung für die Länge von Ganzzahlliteralen, abgesehen davon, was im verfügbaren Speicher gespeichert werden kann.

Beachten Sie, dass führende Nullen in einer Dezimalzahl ungleich Null nicht zulässig sind. Dies dient zur Disambiguierung mit Oktalliteralen im C-Stil, die Python vor Version 3.0 verwendet hat.

Einige Beispiele für ganzzahlige Literale:

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

In Version 3.6 geändert: Unterstriche sind jetzt für Gruppierungszwecke in Literalen zulässig.

Andere Möglichkeiten, Binärdateien auszudrücken:

Sie können die Nullen und Einsen in einem Zeichenfolgenobjekt haben, das manipuliert werden kann (obwohl Sie in den meisten Fällen wahrscheinlich nur bitweise Operationen an der Ganzzahl ausführen sollten) - übergeben Sie einfach die Zeichenfolge aus Nullen und Einsen und die Basis, von der Sie konvertieren (2) ):

>>> int('010101', 2)
21

Optional können Sie das Präfix 0boder haben 0B:

>>> int('0b0010101010', 2)
170

Wenn Sie es 0als Basis übergeben, wird Basis 10 angenommen, wenn die Zeichenfolge kein Präfix enthält:

>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21

Konvertieren von int zurück in von Menschen lesbare Binärdateien:

Sie können eine Ganzzahl an bin übergeben, um die Zeichenfolgendarstellung eines binären Literal anzuzeigen:

>>> bin(21)
'0b10101'

Und Sie können kombinieren binund inthin und her gehen:

>>> bin(int('010101', 2))
'0b10101'

Sie können auch eine Formatspezifikation verwenden, wenn Sie eine Mindestbreite mit vorhergehenden Nullen haben möchten:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'

2

0 am Anfang hier gibt an, dass die Basis 8 (nicht 10) ist, was ziemlich leicht zu sehen ist:

>>> int('010101', 0)
4161

Wenn Sie nicht mit einer 0 beginnen, geht Python davon aus, dass die Zahl Basis 10 ist.

>>> int('10101', 0)
10101

-1

Soweit ich das beurteilen kann, unterstützt Python bis 2.5 nur hexadezimale und oktale Literale. Ich habe einige Diskussionen über das Hinzufügen von Binärdateien zu zukünftigen Versionen gefunden, aber nichts Bestimmtes.


-3

Ich bin mir ziemlich sicher, dass dies eines der Dinge ist, die sich in Python 3.0 ändern, wenn vielleicht bin () mit hex () und oct () übereinstimmt.

EDIT: Die Antwort von lbrandy ist in allen Fällen richtig.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.