Как вы выражаете целое число в виде двоичного числа с литералами 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
синтаксиса для восьмеричных чисел.
Для справки - будущие возможности 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 является правильным во всех случаях.