Estou tentando converter um número inteiro para binário usando a função bin () em Python. No entanto, ele sempre remove os zeros à esquerda, o que eu realmente preciso, de modo que o resultado seja sempre de 8 bits:
Exemplo:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Existe alguma forma de fazer isso?
python
binary
formatting
bitwise-operators
Niels Sønderbæk
fonte
fonte
Respostas:
Use a
format()
função :A
format()
função simplesmente formata a entrada seguindo o mini idioma de especificação de formato . A#
faz com que o formato incluem o0b
prefixo, e o010
tamanho formata a saída para se ajustar em 10 caracteres largura, com0
enchimento; 2 caracteres para o0b
prefixo, os outros 8 para os dígitos binários.Esta é a opção mais compacta e direta.
Se você estiver colocando o resultado em uma string maior, use uma literal de string formatada (3.6+) ou use
str.format()
e coloque o segundo argumento para aformat()
função após os dois pontos do espaço reservado{:..}
:Por acaso, mesmo para formatar apenas um único valor (portanto, sem colocar o resultado em uma string maior), o uso de uma literal de string formatada é mais rápido do que usar
format()
:Mas eu usaria isso apenas se o desempenho em um loop apertado for importante, pois
format(...)
comunica melhor a intenção.Se você não quis o
0b
prefixo, simplesmente solte#
e ajuste o comprimento do campo:fonte
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
e coloque o segundo argumento para a função format () após os dois pontos do espaço reservado{:..}
:f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
.Consulte: Mini-idioma de especificação de formato
Observe que, para o Python 2.6 ou mais antigo, você não pode omitir o identificador de argumento posicional antes
:
, portanto, usefonte
str.format()
aqui quando oformat()
fará. Está faltando o0b
prefixo.str.format
é mais flexível do queformat()
porque permitirá que você faça várias variáveis ao mesmo tempo. Eu continuo esquecendo que aformat
função existe. É certo que é perfeitamente adequado neste caso.str.format()
com apenas um{}
elemento, nenhum outro texto, você está não usando templates string, você está formatando um valor . Nesse caso, basta usarformat()
. :-)estou usando
irá imprimir
fonte
Você pode usar o mini idioma de formatação de string:
Demo:
Resultado:
EDIT: baseado na ideia de @Martijn Pieters
fonte
#
. Também existeformat()
, o que evita que você precise criar um modelo de string completo.Ao usar Python
>= 3.6
, a maneira mais limpa é usar f-strings com formatação de string :Explicação:
var
a variável para formatar:
tudo depois disso é o especificador de formato#
use o formulário alternativo (adiciona o0b
prefixo)0
almofada com zeros10
pad a um comprimento total de 10 (inclui os 2 caracteres para0b
)b
use representação binária para o númerofonte
format(var, "#010b")
comunica a intenção muito melhor. É, no entanto, a opção mais rápida. Mas você já sabe disso, certo, porque eu já abordo tudo o que você postou na minha resposta.Às vezes, você só quer um liner simples:
Python 3
fonte
[ ]
não deve ser necessário -join()
aceita uma expressão geradora.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
precisa fazer duas passagens, uma entrada do gerador é primeiro convertida em uma lista antes de ingressar. Isso exige um pouco de desempenho e é melhor aqui passar uma compreensão da lista do que uma expressão geradora. É uma se as exceções à regra.Você pode usar algo como isto
fonte
"{:0{l}b}".format(num, l=length)
você pode usar o método rjust string da sintaxe python: string.rjust (length, fillchar) fillchar é opcional
e para sua pergunta você escreve assim
então será '0b00000001'
fonte
int
em sua representação binária textual; você nem começa com umint
.Você pode usar o zfill:
impressões:
Eu gosto dessa solução, pois ajuda não apenas na saída do número, mas quando você precisa atribuí-lo a uma variável ... por exemplo, - x = str (datetime.date.today (). Month) .zfill (2) retorne x como '02' para o mês de fevereiro.
fonte
bin(14)
dá `` 0b1110 '' ebin(14).zfill(8)
dá `` 000b1110 '' não `` 0b00001110 '', o que é desejado