Jak wyrażasz literały binarne w Pythonie?

351

Jak wyrażasz liczbę całkowitą jako liczbę binarną za pomocą literałów Python?

Z łatwością mogłem znaleźć odpowiedź na hex:

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

i ósemkowe:

>>> 01267
695
>>> 0100
64

Jak używasz literałów do wyrażenia binarnego w Pythonie?


Podsumowanie odpowiedzi

  • Python 2.5 i wcześniejsze: mogą wyrażać binarnie używając int('01010101111',2)literału, ale nie.
  • Python 2.5 i wcześniejsze: nie ma możliwości wyrażenia literałów binarnych.
  • Python 2.6 beta: Możesz to zrobić tak: 0b1100111lub 0B1100111.
  • Python 2.6 beta: pozwoli również 0o27lub 0O27(drugim znakiem jest litera O) do reprezentowania ósemki.
  • Python 3.0 beta: Taki sam jak 2.6, ale nie pozwoli już na starszą 027składnię ósemkową.
Justin Standard
źródło

Odpowiedzi:

291

Dla odniesienia - przyszłe możliwości Pythona:
Począwszy od Python 2.6 można wyrażać literały binarne za pomocą przedrostka 0b lub 0B :

>>> 0b101111
47

Możesz także użyć nowej funkcji bin, aby uzyskać binarną reprezentację liczby:

>>> bin(173)
'0b10101101'

Wersja rozwojowa dokumentacji: Co nowego w Python 2.6

Andreas Thomas
źródło
72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

Inny sposób.

Louis Brandy
źródło
2
Jest to interesujące, gdy masz ciągi, ale jeśli pracujesz z czystymi liczbami, dodajesz niepotrzebne obliczenia do kodu.
Daniel Möller,
28

Jak wyrażasz literały binarne w Pythonie?

Nie są to literały „binarne”, lecz „literały całkowite”. Możesz wyrażać literały całkowite w formacie binarnym, 0po którym następuje a Blub bpo nich ciąg zer i jedynek, na przykład:

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

Z dokumentacji w Pythonie 3 są następujące sposoby zapewnienia literałów całkowitych w Pythonie:

Literały całkowite są opisane następującymi definicjami leksykalnymi:

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"

Nie ma limitu długości literałów całkowitych oprócz tego, co można przechowywać w dostępnej pamięci.

Zauważ, że początkowe zera w niezerowej liczbie dziesiętnej są niedozwolone. Ma to na celu ujednoznacznienie z literałami ósemkowymi w stylu C, których Python używał przed wersją 3.0.

Kilka przykładów literałów całkowitych:

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

Zmieniono w wersji 3.6: Podkreślenia są teraz dozwolone do celów grupowania w literałach.

Inne sposoby wyrażenia binarnego:

Możesz mieć zera i jedynki w obiekcie łańcuchowym, którymi można manipulować (chociaż w większości przypadków prawdopodobnie powinieneś po prostu wykonać operacje bitowe na liczbie całkowitej) - po prostu przekaż int ciąg zer i jedynek oraz bazę, z której konwertujesz (2 ):

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

Opcjonalnie możesz mieć prefiks 0blub 0B:

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

Jeśli przekażesz go 0jako podstawę, przyjmie on podstawę 10, jeśli ciąg nie zostanie określony z prefiksem:

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

Konwertowanie z int z powrotem na binarny czytelny dla człowieka:

Możesz podać liczbę całkowitą do bin, aby zobaczyć ciąg reprezentujący literał binarny:

>>> bin(21)
'0b10101'

Możesz łączyć bini intporuszać się w tę iz powrotem:

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

Możesz również użyć specyfikacji formatu, jeśli chcesz mieć minimalną szerokość z poprzedzającymi zerami:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
Aaron Hall
źródło
2

0 na początku oznacza, że ​​podstawa to 8 (nie 10), co jest dość łatwe do zauważenia:

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

Jeśli nie zaczynasz od 0, python zakłada, że ​​liczba wynosi 10.

>>> int('10101', 0)
10101
Mehmet Ugurbil
źródło
-1

O ile mogę powiedzieć, Python, do wersji 2.5, obsługuje tylko literały szesnastkowe i ósemkowe. Znalazłem kilka dyskusji na temat dodawania plików binarnych do przyszłych wersji, ale nic konkretnego.

Mark Biek
źródło
-3

Jestem prawie pewien, że jest to jedna z rzeczy ze względu na zmianę w Pythonie 3.0 z być może bin (), aby przejść z hex () i oct ().

EDYCJA: odpowiedź lbrandy jest poprawna we wszystkich przypadkach.

iskrzy
źródło