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


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

Pude encontrar fácilmente la respuesta para 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: puede expresar binario usando int('01010101111',2) pero no con un literal.
  • Python 2.5 y anteriores: no hay ninguna manera de expresar binario literal.
  • Python 2.6 beta: Puedes hacer lo siguiente: 0b1100111 o 0B1100111.
  • Python 2.6 beta: también permitirá que 0o27 o 0O27 (el segundo carácter es la letra O) represente un octal.
  • Python 3.0 beta: Igual que 2.6, pero ya no permitirá la sintaxis anterior de 027 para los octales.
Author: Jim Fasarakis Hilliard, 2008-08-04

6 answers

Para referencia - futuro Posibilidades de Python:
A partir de Python 2.6 puede 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: Qué hay de nuevo en Python 2.6

 247
Author: Andreas Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-16 12:35:36
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

Otra manera.

 66
Author: Louis Brandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-22 17:47:30

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

No son literales "binarios", sino "literales enteros". Puede expresar literales enteros con un formato binario con un 0 seguido de un B o b seguido 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 el siguiente léxico definiciones:

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 a la izquierda 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 usado 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: Ahora se permiten guiones bajos para fines de agrupación en literal.

Otras formas de expresar binario:

Puede tener los ceros y unos en un objeto de cadena que puede ser manipulado (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 0b o 0B:

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

Si lo pasas 0 como la base, asumirá la base 10 si la cadena no lo hace especificar 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 bin y int para 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'
 14
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 15:22:33

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

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

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

>>> int('10101', 0)
10101
 1
Author: Mehmet Ugurbil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-21 22:48:20

Por lo que puedo decir Python, hasta la versión 2.5, solo soporta literales hexadecimales y octales. Encontré algunas discusiones sobre agregar binario a futuras versiones, pero nada definitivo.

 -1
Author: Mark Biek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-04 18:26:13

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.

 -1
Author: sparkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-13 16:46:39