¿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
o0B1100111
. -
Python 2.6 beta: también permitirá que
0o27
o0O27
(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.