Conviértete a binario y mantén los ceros iniciales en Python.

Estoy tratando de convertir un entero a binario usando la función bin () en Python. Sin embargo, siempre elimina los ceros iniciales, que realmente necesito, de modo que el resultado siempre es de 8 bits:

Ejemplo:

bin(1) -> 0b1 # What I would like: bin(1) -> 0b00000001 

¿Hay alguna forma de hacer esto?

Utilice la función format() :

 >>> format(14, '#010b') '0b00001110' 

La función format() simplemente formatea la entrada siguiendo el mini idioma de especificación de formato . El # hace que el formato incluya el prefijo 0b , y el tamaño 010 formatea la salida para que se ajuste a un ancho de 10 caracteres, con 0 rellenos; 2 caracteres para el prefijo 0b , los otros 8 para los dígitos binarios.

Esta es la opción más compacta y directa.

Si está colocando el resultado en una cadena más grande, use una cadena con formato literal (3.6+) o use str.format() y ponga el segundo argumento para la función format() después de los dos puntos del marcador de posición {:..} :

 >>> value = 14 >>> f'The produced output, in binary, is: {value:#010b}' 'The produced output, in binary, is: 0b00001110' >>> 'The produced output, in binary, is: {:#010b}'.format(value) 'The produced output, in binary, is: 0b00001110' 

A medida que sucede, incluso solo para dar formato a un solo valor (por lo tanto, sin colocar el resultado en una cadena más grande), usar un literal de cadena formateada es más rápido que usar format() :

 >>> import timeit >>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format") # use a local for performance 0.40298633499332936 >>> timeit.timeit("f'{v:#010b}'", "v = 14") 0.2850222919951193 

Pero lo usaría solo si el rendimiento en un circuito cerrado es importante, ya que el format(...) comunica mejor la intención.

Si no desea el prefijo 0b , simplemente suelte el # y ajuste la longitud del campo:

 >>> format(14, '08b') '00001110' 
 >>> '{:08b}'.format(1) '00000001' 

Ver: Especificación de formato en mini idioma.


Nota para Python 2.6 o anterior, no puede omitir el identificador de argumento posicional antes de, por lo que use

 >>> '{0:08b}'.format(1) '00000001' 

estoy usando

 bin(1)[2:].zfill(8) 

imprimirá

 '00000001' 

Puede utilizar la cadena de formato de mini idioma:

 def binary(num, pre='0b', length=8, spacer=0): return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:]) 

Manifestación:

 print binary(1) 

Salida:

 '0b00000001' 

EDIT: basado en la idea de @Martijn Pieters

 def binary(num, length=8): return format(num, '#0{}b'.format(length + 2)) 

A veces solo quieres un simple trazador de líneas:

 binary = ''.join(['{0:08b}'.format(ord(x)) for x in input]) 

Python 3

Puedes usar algo como esto

 ("{:0%db}"%length).format(num) 
 module Adder( input upperBit, lowerBit, c_in, output s, c_out) write gate1, gate2, gate3 xor (gate1, upperBit, lowerBit) xor (s, gate1, c_in) and (upperBit, lowerBit) and (gate1, c_in) or (c_out, gate1, gate2) endmodule module ful_adder8( input [7:0) a, b input c_in output [7:0) s, output c_out) write [7:0] carry full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) full_adder fa0( a(a[o]) b(b[0]) c_in(c_in) s(s[0]) c_out(carry[0])) endmodule test def split (n): return (n&0x1,n&0x2,n&0x4,n&0x8,n&0x10,n&0x20,n&0x40,n&0x80) def glue (b0,b1,b2,b3,b4,b5,b6,b7,c): t = 0 if b0: t += 1 if b1: t += 2 if b2: t += 4 if b3: t += 8 if b4: t += 16 if b5: t += 32 if b6: t += 64 if b7: t += 128 if c: t += 256 return t def myadd (a,b): (a0,a1,a2,a3,a4,a5,a6,a7) = split(a) (b0,b1,b2,b3,b4,b5,b6,b7) = split(b) (s0,s1,s2,s3,s4,s5,s6,s7,c) = addEightBits(a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7,false) return glue (s0,s1,s2,s3,s4,s5,s6,s7,c) 

Puedes usar zfill:

 print str(1).zfill(2) print str(10).zfill(2) print str(100).zfill(2) 

huellas dactilares:

 01 10 100 

Me gusta esta solución, ya que ayuda no solo a la hora de emitir el número, sino también cuando necesita asignarlo a una variable … por ejemplo, – x = str (datetime.date.today (). Month) .zfill (2) will devuelve x como ’02’ para el mes de feb.