Как вы выражаете двоичные литералы в Python?
Вопрос
Как вы выражаете целое число в виде двоичного числа с помощью литералов Python?
Мне легко удалось найти ответ на этот вопрос .:
>>> 0x12AF
4783
>>> 0x100
256
и восьмеричный:
>>> 01267
695
>>> 0100
64
Как вы используете литералы для выражения двоичных файлов в Python?
Краткое изложение ответов
- Python 2.5 и более ранние версии:может выражать двоичный код с помощью
int('01010101111',2)
но не в буквальном смысле. - Python 2.5 и более ранние версии:есть ни за что для выражения двоичных литералов.
- Бета-версия Python 2.6:Вы можете сделать вот так:
0b1100111
или0B1100111
. - Бета-версия Python 2.6:также позволит
0o27
или0O27
(второй символ - буква O) для обозначения восьмеричного числа. - Бета-версия Python 3.0:То же, что и 2.6, но больше не позволит использовать более старые
027
синтаксис для окталов.
Решение
Для справки—будущее Возможности Python:
Начиная с Python 2.6, вы можете выражать двоичные литералы с помощью префикса 0b или 0B:
>>> 0b101111
47
Вы также можете использовать новый bin функция для получения двоичного представления числа:
>>> bin(173)
'0b10101101'
Рабочая версия документации: Что нового в Python 2.6
Другие советы
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255
Другой способ.
Как вы выражаете двоичные литералы в 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'
0 в начале здесь указывает, что база равна 8 (а не 10), что довольно легко увидеть:
>>> int('010101', 0)
4161
Если вы не начинаете с 0, то python предполагает, что число равно основанию 10.
>>> int('10101', 0)
10101
Насколько я могу судить, Python, вплоть до версии 2.5, поддерживает только шестнадцатеричные и восьмеричные литералы.Я нашел несколько обсуждений о добавлении двоичного кода в будущие версии, но ничего определенного.
Я почти уверен, что это одна из причин изменения в Python 3.0, возможно, с bin () на использование hex() и oct ().
Редактировать:ответ lbrandy верен во всех случаях.