Як ви виражаєте бінарні літерали в Python?


351

Як ви виражаєте ціле число у вигляді двійкового числа з літералами 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: Те саме, що і 2.6, але більше не дозволятиме 027старішому синтаксису для восьмериків.

Відповіді:


291

Для довідки - майбутні можливості Python:
Починаючи з Python 2.6, ви можете виражати бінарні буквари за допомогою префікса 0b або 0B :

>>> 0b101111
47

Ви також можете використовувати нову функцію бін, щоб отримати двійкове представлення числа:

>>> 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"

Немає обмеження для довжини цілих чисел, крім того, що може зберігатися у доступній пам'яті.

Зверніть увагу, що провідні нулі в ненульовому десятковому числі не допускаються. Це для розбіжностей з восьми буквальними буквами у стилі С, які 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, пітон вважає, що число є базовим 10.

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

-1

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


-3

Я впевнений, що це одна з речей, пов’язана зі зміною Python 3.0, можливо, з bin (), щоб перейти з hex () та oct ().

EDIT: Відповідь Лбранді правильна у всіх випадках.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.