Как вы выражаете двоичные литералы в Python?

351

Как вы выражаете целое число в виде двоичного числа с литералами Python?

Я легко смог найти ответ для гекса:

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

и восьмеричное:

>>> 01267
695
>>> 0100
64

Как вы используете литералы для выражения двоичного в Python?


Резюме Ответов

  • Python 2.5 и более ранние версии: могут выражать двоичные данные, int('01010101111',2)но не с литералом
  • Python 2.5 и более ранние версии : нет способа выразить двоичные литералы.
  • Python 2.6 beta: вы можете сделать так: 0b1100111или 0B1100111.
  • Python 2.6 beta: также позволяет 0o27или 0O27(второй символ - буква O) представлять восьмеричное число.
  • Бета-версия Python 3.0: то же, что и 2.6, но более не допускает использования более старого 027синтаксиса для восьмеричных чисел.
Джастин Стандарт
источник

Ответы:

291

Для справки - будущие возможности Python:
начиная с Python 2.6 вы можете выражать двоичные литералы с помощью префикса 0b или 0B :

>>> 0b101111
47

Вы также можете использовать новую функцию bin, чтобы получить двоичное представление числа:

>>> bin(173)
'0b10101101'

Разрабатываемая версия документации: что нового в Python 2.6

Андреас Томас
источник
72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

Другой путь.

Луи Бренди
источник
2
Это интересно, когда у вас есть строки, но если вы работаете с чистыми числами, вы добавляете ненужные вычисления в код.
Даниэль Мёллер
28

Как вы выражаете двоичные литералы в Python?

Они не "двоичные" литералы, а "целочисленные литералы". Вы можете выразить целочисленные литералы в двоичном формате с 0последующим после Bили bпосле ряда нулей и единиц, например:

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

Из документов Python 3 это способы предоставления целочисленных литералов в Python:

Целочисленные литералы описываются следующими лексическими определениями:

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"

Нет никаких ограничений на длину целочисленных литералов, кроме того, что может быть сохранено в доступной памяти.

Обратите внимание, что начальные нули в ненулевом десятичном числе не допускаются. Это для устранения неоднозначности с восьмеричными литералами в стиле C, которые Python использовал до версии 3.0.

Некоторые примеры целочисленных литералов:

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

Изменено в версии 3.6: Подчеркивание теперь разрешено для группировки в литералах.

Другие способы выражения двоичного кода:

Вы можете иметь нули и единицы в строковом объекте, которым можно манипулировать (хотя в большинстве случаев вам, вероятно, следует просто выполнять побитовые операции с целым числом) - просто передайте int строку нулей и единиц и базу, из которой вы конвертируете (2 ):

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

При желании вы можете иметь префикс 0bили 0B:

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

Если вы передадите его 0как основание, оно примет основание 10, если строка не содержит префикса:

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

Преобразование из int обратно в читаемый двоичный код:

Вы можете передать целое число в bin, чтобы увидеть строковое представление двоичного литерала:

>>> bin(21)
'0b10101'

И вы можете комбинировать binи intидти вперед и назад

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

Вы также можете использовать спецификацию формата, если вы хотите иметь минимальную ширину с предыдущими нулями:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
Аарон Холл
источник
2

0 в начале здесь указывает, что основание составляет 8 (не 10), что довольно легко увидеть:

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

Если вы не начинаете с 0, то python предполагает, что число является основанием 10.

>>> int('10101', 0)
10101
Мехмет Угурбиль
источник
-1

Насколько я могу сказать, Python до версии 2.5 поддерживает только шестнадцатеричные и восьмеричные литералы. Я нашел некоторые обсуждения о добавлении двоичных файлов в будущие версии, но ничего определенного.

Марк Бик
источник
-3

Я почти уверен, что это одна из вещей из-за изменений в Python 3.0, возможно, в bin () добавлены hex () и oct ().

РЕДАКТИРОВАТЬ: ответ lbrandy является правильным во всех случаях.

Sparkes
источник