Como você expressa literais binários em Python?


351

Como você expressa um número inteiro como um número binário com literais Python?

Consegui facilmente encontrar a resposta para o hex:

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

e octal:

>>> 01267
695
>>> 0100
64

Como você usa literais para expressar binário em Python?


Resumo das Respostas

  • Python 2.5 e anterior: pode expressar o binário usando, int('01010101111',2)mas não com um literal.
  • Python 2.5 e versões anteriores: não há como expressar literais binários.
  • Python 2.6 beta: Você pode fazer o seguinte: 0b1100111ou 0B1100111.
  • Python 2.6 beta: também permitirá 0o27ou 0O27(o segundo caractere é a letra O) para representar um octal.
  • Python 3.0 beta: o mesmo que 2.6, mas não permitirá mais a 027sintaxe mais antiga para octais.

Respostas:


291

Para referência - possibilidades futuras do Python:
A partir do Python 2.6, você pode expressar literais binários usando o prefixo 0b ou 0B :

>>> 0b101111
47

Você também pode usar a nova função bin para obter a representação binária de um número:

>>> bin(173)
'0b10101101'

Versão de desenvolvimento da documentação: O que há de novo no Python 2.6


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

Outra maneira.


2
Isso é interessante para quando você tem strings, mas se estiver trabalhando com números puros, adicione cálculos desnecessários ao código.
Daniel Möller

28

Como você expressa literais binários em Python?

Eles não são literais "binários", mas "literais inteiros". Você pode expressar literais inteiros com um formato binário com um 0seguido por um Bou bseguido por uma série de zeros e uns, por exemplo:

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

Nos documentos do Python 3 , estas são as maneiras de fornecer literais inteiros no Python:

Literais inteiros são descritos pelas seguintes definições lexicais:

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"

Não há limite para o comprimento de literais inteiros além do que pode ser armazenado na memória disponível.

Observe que zeros à esquerda em um número decimal diferente de zero não são permitidos. Isso ocorre por desambiguação com literais octais no estilo C, que o Python usou antes da versão 3.0.

Alguns exemplos de literais inteiros:

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

Alterado na versão 3.6: Os sublinhados agora são permitidos para fins de agrupamento em literais.

Outras maneiras de expressar binário:

Você pode ter zeros e uns em um objeto de string que pode ser manipulado (embora você provavelmente deva executar operações bit a bit no número inteiro na maioria dos casos) - basta passar int a string de zeros e uns e a base da qual você está convertendo (2 ):

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

Opcionalmente, você pode ter o prefixo 0bou 0B:

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

Se você passar 0como base, ele assumirá a base 10 se a sequência não especificar com um prefixo:

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

Convertendo de int de volta para binário legível por humanos:

Você pode passar um número inteiro para bin para ver a representação em cadeia de um literal binário:

>>> bin(21)
'0b10101'

E você pode combinar bine intir e voltar:

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

Você também pode usar uma especificação de formato, se desejar ter largura mínima com zeros anteriores:

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

2

0 no início aqui especifica que a base é 8 (não 10), o que é bastante fácil de ver:

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

Se você não começar com um 0, o python assume que o número é a base 10.

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

-1

Tanto quanto eu posso dizer ao Python, até o 2.5, suporta apenas literais hexadecimais e octais. Eu encontrei algumas discussões sobre como adicionar binário a versões futuras, mas nada definitivo.


-3

Eu tenho certeza que essa é uma das coisas devido à alteração no Python 3.0 com talvez bin () para ir com hex () e oct ().

EDIT: a resposta da lbrandy está correta em todos os casos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.