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 sea siempre de 8 bits:
Ejemplo:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
¿Hay alguna forma de hacer esto?
python
binary
formatting
bitwise-operators
Niels Sønderbæk
fuente
fuente
Respuestas:
Usa la
format()
función :La
format()
función simplemente formatea la entrada siguiendo el mini idioma de Especificación de formato . La#
hace que el formato incluye el0b
prefijo, y el010
tamaño formatea la salida para caber en 10 caracteres de ancho, con0
material de relleno; 2 caracteres para el0b
prefijo, los otros 8 para los dígitos binarios.Esta es la opción más compacta y directa.
Si coloca el resultado en una cadena más grande, use un literal de cadena con formato (3.6+) o use
str.format()
y coloque el segundo argumento para laformat()
función después de los dos puntos del marcador de posición{:..}
:De hecho, incluso para formatear un solo valor (sin poner el resultado en una cadena más grande), usar un literal de cadena formateado es más rápido que usar
format()
:Pero lo usaría solo si el rendimiento en un circuito cerrado es importante, ya que
format(...)
comunica mejor la intención.Si no desea el
0b
prefijo, simplemente suelte#
y ajuste la longitud del campo:fuente
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
y ponga el segundo argumento para la función format () después de los dos puntos del marcador de posición{:..}
:f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
.Ver: Especificación de formato Mini-idioma
Nota para Python 2.6 o anterior, no puede omitir el identificador de argumento posicional antes
:
, así que usefuente
str.format()
aquí cuandoformat()
lo hará. Te falta el0b
prefijo.str.format
es más flexible queformat()
porque te permitirá hacer múltiples variables a la vez. Sigo olvidando que laformat
función incluso existe. Es cierto que es perfectamente adecuado en este caso.str.format()
un solo{}
elemento, ningún otro texto, no usa plantillas de cadenas, está formateando un valor . En ese caso solo úsaloformat()
. :-)estoy usando
imprimirá
fuente
Puede usar el mini idioma de formato de cadena:
Manifestación:
Salida:
EDITAR: basado en la idea de @Martijn Pieters
fuente
#
. También existeformat()
, lo que le ahorra tener que hacer una plantilla de cadena completa.Cuando se usa Python
>= 3.6
, la forma más limpia es usar cadenas f con formato de cadena :Explicación:
var
la variable a formatear:
todo después de esto es el especificador de formato#
usa la forma alternativa (agrega el0b
prefijo)0
almohadilla con ceros10
pad a una longitud total de 10 (esto incluye los 2 caracteres para0b
)b
usar representación binaria para el númerofuente
format(var, "#010b")
comunica la intención mucho mejor. Sin embargo, es la opción más rápida. Pero eso ya lo sabes, porque ya cubro todo lo que publicaste en mi respuesta.A veces solo quieres un revestimiento simple:
Python 3
fuente
[ ]
no debería ser necesario:join()
acepta una expresión generadora.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
necesita hacer dos pases, una entrada del generador se convierte primero en una lista antes de unirse. Esto tiene un costo en el rendimiento y es realmente mejor pasar una comprensión de la lista en lugar de una expresión generadora. Es uno si son excepciones a la regla.Puedes usar algo como esto
fuente
"{:0{l}b}".format(num, l=length)
puede usar el método de cadena rjust de la sintaxis de python: string.rjust (length, fillchar) fillchar es opcional
y para tu pregunta puedes escribir así
entonces será '0b00000001'
fuente
int
a su representación binaria textual; Ni siquiera empiezas con unint
.Puedes usar zfill:
huellas dactilares:
Me gusta esta solución, ya que ayuda no solo al generar 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 febrero.
fuente
bin(14)
da '' 0b1110 '' ybin(14).zfill(8)
da '' 000b1110 '' no '' 0b00001110 '', que es lo que se desea