Convertendo número inteiro em binário em python

179

Para converter um número inteiro em um binário, usei este código:

>>> bin(6)  
'0b110'

e quando apagar o '0b', eu uso isso:

>>> bin(6)[2:]  
'110'

O que posso fazer se quiser mostrar 6como em 00000110vez de 110?

Smith
fonte
2
Possível duplicata do Python int para binário?
Martin Thoma 14/03

Respostas:

355
>>> '{0:08b}'.format(6)
'00000110'

Apenas para explicar as partes da string de formatação:

  • {} coloca uma variável em uma string
  • 0 pega a variável na posição de argumento 0
  • :adiciona opções de formatação para essa variável (caso contrário, isso representaria decimal 6)
  • 08 formata o número para oito dígitos preenchidos com zero à esquerda
  • b converte o número em sua representação binária

Se você estiver usando uma versão do Python 3.6 ou superior, também poderá usar as f-strings:

>>> f'{6:08b}'
'00000110'
eumiro
fonte
7
O primeiro 0significa o 0thargumento para format. Após o cólon é a formatação, os segundos 0meios de enchimento de zero a 8 e espaços bpara binário
jamylak
@Aif: Além disso, dê uma olhada na documentação padrão docs.python.org/library/…
pepr
19
Isso pode ser simplificado com a format() função : format(6, '08b'); a função assume um valor (ao qual o {..}slot se aplica) e uma especificação de formatação (o que você colocaria depois da :string de formatação).
Martijn Pieters
4
'{0:08b}'.format(-6)-> '-0000110'. e se você não quiser um sinal? struct? -6%256?
n611x007
1
@ AK47 Sim, desde que Pythoon 2.6 você pode escrever constantes de int em formato binário com 0b ou 0B prefixo: 0b00000110
Denis Barmenkov
102

Apenas outra ideia:

>>> bin(6)[2:].zfill(8)
'00000110'

Maneira mais curta via interpolação de strings ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'
mshsayem
fonte
7
Observe que esta solução é mais rápida que a aceita . Qual solução é mais clara (ou, devo dizer, Pythonic) é provavelmente uma questão de gosto pessoal.
ar
Ainda estou aprendendo a essência da pitonicidade, mas isso é claramente muito mais versátil. Inicialmente, fiquei empolgado ao ver a solução aceita com sua explicação elegante, mas fiquei alarmado que o objeto que estava sendo chamado para fazer os métodos fosse escrito como uma única sequência com todas as especificações incorporadas, eliminando o envolvimento de variáveis ​​em coisas como o comprimento desejado da cadeia de bits. Isso resolve isso completamente e é tão intuitivo (pelo menos para o Python 2) que não há necessidade de explicar cada caractere!
Post169
Não funciona para números inteiros negativos, bin(-6)[2:].zfill(8)lê-se como'0000b110'
jlandercy
20

Um método um pouco distorcido ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
sobel
fonte
1
Bom método. Mas eu não conseguia entender o que esta parte do seu código está fazendo: str ((x >> i) & 1)
Gregory
2
@ Gregory: muda os bits xpara a direita e usa ANDs 1, extraindo efetivamente um bit (0 ou 1) por vez.
usr2564301
16

Basta usar a função de formatação

format(6, "08b")

A forma geral é

format(<the_integer>, "<0><width_of_string><format_specifier>")
único
fonte
1
Sim, eu como este, simples, de e um dos mais rápidos :-) 1000000 loops, best of 3: 556 ns per loop
SebMa
10

A resposta do eumiro é melhor, no entanto, estou apenas postando isso por variedade:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
fonte
3
Heh. Isso é tão profundamente errado que eu tive que aprovar. Interpretar os dígitos como decimal é astuto. Pior ainda:'%08x' % int(bin(6)[2:], 16)
Mad Physicist
6

.. ou se você não tiver certeza de que sempre deve ter 8 dígitos, passe-o como um parâmetro:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'
thebjorn
fonte
5

numpy.binary_repr(num, width=None) tem um argumento de largura mágica

Exemplos relevantes da documentação vinculada acima:

>>> np.binary_repr(3, width=4)
'0011'

O complemento dos dois é retornado quando o número de entrada é negativo e a largura é especificada:

>>> np.binary_repr(-3, width=5)
'11101'
Tom Hale
fonte
4

Indo Old School sempre funciona

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))
Shadrack Kimutai
fonte
number=number/2dá float, assim number=number//2costuras melhores, também eu substituiria number=number//2com number//=2e b=b+"0"comb+="0"
brambor
além disso, você não tem o preenchimento 0 como o OP exigido
Brambor 12/11/19
1
('0' * 7 + bin(6)[2:])[-8:]

ou

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
zerg
fonte
2
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
precisa saber é o seguinte
0

Supondo que você queira analisar o número de dígitos usados ​​para representar a partir de uma variável que nem sempre é constante, uma boa maneira será usar numpy.binary.

pode ser útil quando você aplica binário a conjuntos de potência

import numpy as np
np.binary_repr(6, width=8)
ama
fonte
0

A melhor maneira é especificar o formato.

format(a, 'b')

retorna o valor binário de a no formato string.

Para converter uma string binária de volta em número inteiro, use a função int ().

int('110', 2)

retorna o valor inteiro da cadeia binária.

Pranjalya
fonte
Melhor seria o formato (a, '08b') para obter o formato desejado pelo usuário.
ZSG 27/04
0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
Dmity Bryuhanov
fonte