Как вы выражаете бинарные литералы в Python?

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

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

>>> 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 beta: то же, что и 2.6, но больше не будет позволять более старый синтаксис 027 для восьмеричных.

Ответ 1

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

>>> 0b101111
47

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

>>> bin(173)
'0b10101101'

Версия для разработки документации: Что нового в Python 2.6

Ответ 2

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

Другой способ.

Ответ 3

Как вы выражаете бинарные литералы в Python?

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

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

Из Python 3 docs, это способы предоставления целочисленных литералов в 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'

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

EDIT: lbrandy ответ правильный во всех случаях.