¿Cómo expresas literales binarios en Python?

351

¿Cómo se expresa un número entero como un número binario con literales de Python?

Pude encontrar fácilmente la respuesta para hexadecimal:

>>> 0x12AF
4783
>>> 0x100
256

y octal:

>>> 01267
695
>>> 0100
64

¿Cómo se usan los literales para expresar binarios en Python?


Resumen de respuestas

  • Python 2.5 y anteriores: puede expresar binario usando int('01010101111',2)pero no con un literal.
  • Python 2.5 y anteriores: no hay forma de expresar literales binarios.
  • Python 2.6 beta: puede hacerlo así: 0b1100111o 0B1100111.
  • Python 2.6 beta: también permitirá 0o27o 0O27(el segundo carácter es la letra O) para representar un octal.
  • Python 3.0 beta: igual que 2.6, pero ya no permitirá la 027sintaxis anterior para los octales.
Justin Standard
fuente

Respuestas:

291

Como referencia : posibilidades futuras de Python: a
partir de Python 2.6, puede expresar literales binarios con el prefijo 0b o 0B :

>>> 0b101111
47

También puede usar la nueva función bin para obtener la representación binaria de un número:

>>> bin(173)
'0b10101101'

Versión de desarrollo de la documentación: Novedades de Python 2.6

Andreas Thomas
fuente
72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

De otra manera.

Louis Brandy
fuente
2
Esto es interesante cuando tiene cadenas, pero si trabaja con números puros, agrega cálculos innecesarios al código.
Daniel Möller
28

¿Cómo expresas literales binarios en Python?

No son literales "binarios", sino "literales enteros". Puede expresar literales enteros con un formato binario 0seguido de Bao bseguido de una serie de ceros y unos, por ejemplo:

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

De los documentos de Python 3 , estas son las formas de proporcionar literales enteros en Python:

Los literales enteros se describen mediante las siguientes definiciones léxicas:

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"

No hay límite para la longitud de los literales enteros, aparte de lo que se puede almacenar en la memoria disponible.

Tenga en cuenta que los ceros iniciales en un número decimal distinto de cero no están permitidos. Esto es para la desambiguación con literales octales de estilo C, que Python utilizó antes de la versión 3.0.

Algunos ejemplos de literales enteros:

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
      100_000_000_000                   0b_1110_0101

Cambiado en la versión 3.6: los guiones bajos ahora están permitidos para fines de agrupación en literales.

Otras formas de expresar binario:

Puede tener los ceros y unos en un objeto de cadena que puede manipularse (aunque probablemente debería hacer operaciones bit a bit en el entero en la mayoría de los casos): simplemente pase int la cadena de ceros y unos y la base desde la que está convirtiendo (2 ):

>>> int('010101', 2)
21

Opcionalmente, puede tener el prefijo 0bo 0B:

>>> int('0b0010101010', 2)
170

Si lo pasa 0como base, asumirá la base 10 si la cadena no se especifica con un prefijo:

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

Convertir de int a binario legible por humanos:

Puede pasar un entero a bin para ver la representación de cadena de un literal binario:

>>> bin(21)
'0b10101'

Y puedes combinar biny intpara ir y venir:

>>> bin(int('010101', 2))
'0b10101'

También puede usar una especificación de formato, si desea tener un ancho mínimo con ceros anteriores:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
Aaron Hall
fuente
2

0 al comienzo aquí especifica que la base es 8 (no 10), lo cual es bastante fácil de ver:

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

Si no comienza con un 0, Python asume que el número es base 10.

>>> int('10101', 0)
10101
Mehmet Ugurbil
fuente
-1

Por lo que puedo decirle a Python, hasta 2.5, solo admite literales hexadecimales y octales. Encontré algunas discusiones sobre agregar binario a futuras versiones, pero nada definitivo.

Mark Biek
fuente
-3

Estoy bastante seguro de que esta es una de las cosas debido al cambio en Python 3.0 con quizás bin () para ir con hex () y oct ().

EDITAR: la respuesta de lbrandy es correcta en todos los casos.

chispas
fuente