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?


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'

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'

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'

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>")

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

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'

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'

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))

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

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)

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.


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.