Conversión de entero a binario en python

179

Para convertir un entero a un binario, he usado este código:

>>> bin(6)  
'0b110'

y cuando borro el '0b', uso esto:

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

¿Qué puedo hacer si quiero mostrar 6como en 00000110lugar de 110?

Herrero
fuente
2
Posible duplicado de Python int a binario?
Martin Thoma

Respuestas:

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

Solo para explicar las partes de la cadena de formato:

  • {} coloca una variable en una cadena
  • 0 toma la variable en la posición de argumento 0
  • :agrega opciones de formato para esta variable (de lo contrario, representaría decimal 6)
  • 08 formatea el número a ocho dígitos con relleno de cero a la izquierda
  • b convierte el número a su representación binaria

Si está utilizando una versión de Python 3.6 o superior, también puede usar cadenas f:

>>> f'{6:08b}'
'00000110'
eumiro
fuente
77
El primero 0significa el 0thargumento de format. Después de los dos puntos es el formato, el segundo 0significa relleno de cero a 8 espacios y bpara binario
jamylak
@Aif: Además, eche un vistazo a la documentación estándar docs.python.org/library/…
pepr
19
Esto se puede simplificar con la format() función : format(6, '08b'); la función toma un valor (a lo que se {..}aplica el espacio) y una especificación de formato (lo que sea que coloque después :de la cadena de formato).
Martijn Pieters
44
'{0:08b}'.format(-6)-> '-0000110'. ¿Qué pasa si no quieres una señal? struct? -6%256?
n611x007
1
@ AK47 Sí, desde Pythoon 2.6 puede escribir constantes int en forma binaria con el prefijo 0b o 0B: 0b00000110
Denis Barmenkov
102

Solo otra idea:

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

Camino más corto a través de la interpolación de cadenas ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'
mshsayem
fuente
77
Tenga en cuenta que esta solución es más rápida que la aceptada . La solución más clara (o, me atrevo a decir, Pythonic) es probablemente una cuestión de gusto personal.
Aire
Todavía estoy aprendiendo la esencia de la pitonicidad, pero esto es claramente mucho más versátil. Inicialmente, me entusiasmó ver la solución aceptada con su elegante explicación, pero me alarmó que el objeto que se llamaba para hacer los métodos se escribiera como una sola cadena con todas las especificaciones integradas, eliminando la participación de variables en cosas como la longitud deseada de la cadena de bits. ¡Esto lo resuelve completamente y es tan intuitivo (al menos para Python 2) que no hay necesidad de explicar cada personaje!
Post169
No funciona para enteros negativos que se bin(-6)[2:].zfill(8)lee como'0000b110'
jlandercy
20

Un poco de método de giro ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'
sobel
fuente
1
Buen método Pero no pude entender lo que está haciendo esta parte de su código: str ((x >> i) & 1)
Gregory
2
@Gregory: desplaza los bits xhacia la derecha y AND 1, extrayendo efectivamente un bit (0 o 1) a la vez.
usr2564301
16

Solo usa la función de formato

format(6, "08b")

La forma general es

format(<the_integer>, "<0><width_of_string><format_specifier>")
el único
fuente
1
Sí, me gusta este, es simple y uno de los más rápidos :-) 1000000 loops, best of 3: 556 ns per loop
SebMa
10

La respuesta de eumiro es mejor, sin embargo, solo estoy publicando esto para la variedad:

>>> "%08d" % int(bin(6)[2:])
00000110
jedwards
fuente
3
Je Esto es tan profundamente incorrecto que tuve que votarlo. Interpretar los dígitos como decimales es astuto. Peor aún:'%08x' % int(bin(6)[2:], 16)
Mad Physicist
6

.. o si no está seguro de que siempre debe tener 8 dígitos, puede pasarlo como parámetro:

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

numpy.binary_repr(num, width=None) tiene un argumento de ancho mágico

Ejemplos relevantes de la documentación vinculada anteriormente:

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

El complemento de dos se devuelve cuando el número de entrada es negativo y se especifica el ancho:

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

Ir a la vieja escuela siempre 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
fuente
number=number/2da flotación, por lo que number=number//2parece mejor, también reemplazaría number=number//2con number//=2y b=b+"0"conb+="0"
Brambor
Además, no tiene el relleno 0 como lo requiere el OP
Brambor
1
('0' * 7 + bin(6)[2:])[-8:]

o

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
zerg
fuente
2
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Nic3500
0

Suponiendo que desea analizar el número de dígitos utilizados para representar a partir de una variable que no siempre es constante, una buena manera será usar numpy.binary.

podría ser útil cuando aplica binario a conjuntos de potencia

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

La mejor manera es especificar el formato.

format(a, 'b')

devuelve el valor binario de a en formato de cadena.

Para convertir una cadena binaria a entero, use la función int ().

int('110', 2)

Devuelve el valor entero de una cadena binaria.

Pranjalya
fuente
Mejor sería el formato (a, '08b') para obtener el formato que el usuario quería.
ZSG
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
fuente