Jak wyrażać literały binarne w Pythonie?

Jak wyrazić liczbę całkowitą jako liczbę binarną za pomocą literałów Pythona?

Łatwo znalazłem odpowiedź na hex:

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

I ósemkowe:

>>> 01267
695
>>> 0100
64

Jak używać literałów do wyrażania binarnego w Pythonie?


podsumowanie odpowiedzi

  • Python 2.5 i wcześniejsze: może wyrażać binarne za pomocą int('01010101111',2), ale nie za pomocą literała.
  • Python 2.5 i wcześniejsze: nie ma nie ma możliwości wyrażenia binarnego literały.
  • Python 2.6 beta: możesz zrobić tak: 0b1100111 lub 0B1100111.
  • Python 2.6 beta: pozwala również 0o27 lub 0O27 (drugi znak to litera O) reprezentować ósemkę.
  • Python 3.0 beta: taki sam jak 2.6, ale nie będzie już zezwalał na starszą składnię 027 dla oktali.
Author: Jim Fasarakis Hilliard, 2008-08-04

6 answers

Dla odniesienia - przyszłość możliwości Pythona:
Począwszy od Pythona 2.6 możesz wyrażać literały binarne za pomocą prefiksu 0b lub 0b:

>>> 0b101111
47

Możesz również użyć nowej funkcji bin , aby uzyskać binarną reprezentację liczby:

>>> bin(173)
'0b10101101'

Wersja rozwojowa dokumentacji: Co nowego w Pythonie 2.6

 247
Author: Andreas Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-16 12:35:36
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255
W inny sposób.
 66
Author: Louis Brandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 17:47:30

Jak wyrażasz literały binarne w Pythonie?

Nie są literałami "binarnymi" , ale raczej "literałami całkowitymi". Literały całkowite można wyrazić w formacie binarnym za pomocą 0, po którym następuje B lub b, po których następuje szereg zer i jedynek, na przykład:

>>> 0b0010101010
170
>>> 0B010101
21
W Pythonie 3 Docs , są to sposoby dostarczania literałów całkowitych w Pythonie:

Literały całkowite są opisane za pomocą następującej leksyki definicje:

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 liter całkowitych poza tym, co może być przechowywany w dostępnej pamięci.

Zauważ, że początkowe zera w niezerowej liczbie dziesiętnej są niedozwolone. To jest do disambiguacji z literałami ósemkowymi w stylu C, które Python używany przed wersją 3.0.

Niektóre przykłady liter całkowitych:
7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

zmieniono w wersji 3.6: podkreślniki są teraz dozwolone dla celów grupowania w literały.

Inne sposoby wyrażania binarnego:

Możesz mieć zera i jedynki w obiekcie string, który można manipulować ( chociaż prawdopodobnie powinieneś wykonywać operacje bitowe na liczbie całkowitej w większości przypadków) - 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 0b lub 0B:

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

Jeśli przekażesz ją 0 jako bazę, to przyjmie bazę 10, jeśli łańcuch nie określ za pomocą prefiksu:

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

Konwersja z int z powrotem do pliku binarnego czytelnego dla człowieka:

Możesz przekazać liczbę całkowitą do bin, aby zobaczyć reprezentację ciągu znaków literału binarnego:

>>> bin(21)
'0b10101'

I możesz połączyć bin i int, aby przejść tam 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'
 14
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 15:22:33

0 Na początku tutaj określa, że baza jest 8 (nie 10), co jest dość łatwe do zobaczenia:

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

Jeśli nie zaczniesz od 0, to python zakłada, że liczba jest bazą 10.

>>> int('10101', 0)
10101
 1
Author: Mehmet Ugurbil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 22:48:20

Z tego co wiem Python, do 2.5 obsługuje tylko litery szesnastkowe i ósemkowe. Znalazłem kilka dyskusji na temat dodawania binarnych do przyszłych wersji, ale nic konkretnego.

 -1
Author: Mark Biek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 18:26:13

Jestem prawie pewien, że jest to jedna z rzeczy, które należy zmienić w Pythonie 3.0 z bin (), aby przejść z hex () i oct ().

Edytuj: odpowiedź lbrandy ' ego jest prawidłowa we wszystkich przypadkach.

 -1
Author: sparkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-13 16:46:39