python syntax binary integer literals

¿Cómo se expresan los literales binarios en Python?



syntax binary (6)

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

Pude encontrar fácilmente la respuesta para el hex:

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

y octal:

>>> 01267 695 >>> 0100 64

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

Resumen de las respuestas

  • Python 2.5 y anteriores: pueden expresar binario usando int(''01010101111'',2) pero no con un literal.
  • Python 2.5 y versiones anteriores: no hay forma de expresar literales binarios.
  • Python 2.6 beta: Puedes hacerlo así: 0b1100111 o 0B1100111 .
  • Python 2.6 beta: también permitirá que 0o27 o 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 sintaxis 027 más antigua para octales.

¿Cómo se expresan los literales binarios en Python?

No son literales "binarios", sino más bien, "literales enteros". Puede expresar literales enteros con un formato binario con un 0 seguido de B o b seguido de una serie de ceros y unos, por ejemplo:

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

De los docs 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 desambiguación con literales octales de estilo C, que Python usó 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

Modificado en la versión 3.6: los guiones bajos ahora están permitidos para propósitos de agrupación en literales.

Otras formas de expresar binario:

Puede tener los ceros y unos en un objeto de cadena que se pueden manipular (aunque en la mayoría de los casos es probable que solo deba realizar operaciones a nivel de bits en el entero), 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 0b o 0B :

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

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

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

Conversión de int de vuelta 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 bin e int para ir y venir:

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

También puede utilizar 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''


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

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

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

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


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

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


Para referencia— posibilidades futuras de Python:
Comenzando con Python 2.6 puedes expresar literales binarios usando 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 en Python 2.6


Por lo que puedo decir de Python, hasta 2.5, solo admite literales hexadecimales y octales. Encontré algunas discusiones sobre la adición de binarios a futuras versiones, pero nada definitivo.


>>> print int(''01010101111'',2) 687 >>> print int(''11111111'',2) 255

De otra manera.