Как вы выражаете бинарные литералы в 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 ответ правильный во всех случаях.