Convertir en binaire et garder les zéros en Python
J'essaie de convertir un entier en binaire en utilisant la fonction bin () en Python. Cependant, il supprime toujours les zéros principaux, dont j'ai réellement besoin, de sorte que le résultat est toujours 8 bits:
Exemple:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Y a-t-il un moyen de le faire?
8 réponses
Utiliser le format()
la fonction:
>>> format(14, '#010b')
'0b00001110'
La fonction format()
formate simplement l'entrée en suivant la format Specification mini language . Le #
fait que le format inclut le préfixe 0b
, et la taille 010
formate la sortie en largeur de 10 caractères, avec un remplissage 0
; 2 caractères pour le préfixe 0b
, les 8 autres pour les chiffres binaires.
C'est L'option la plus compacte et la plus directe.
Si vous mettez le résultat dans un plus grand chaîne, utilisation str.format()
et placez le deuxième argument de la fonction format()
après les deux-points de l'espace réservé {:..}
:
>>> 'The produced output, in binary, is: {:#010b}'.format(14)
'The produced output, in binary, is: 0b00001110'
Si vous ne voulez pas le préfixe 0b
, déposez simplement le #
et ajustez la longueur du champ:
>>> format(14, '08b')
'00001110'
>>> '{:08b}'.format(1)
'00000001'
Voir: Spécification De Format Mini-Langue
Note pour Python 2.6 ou plus, vous ne pouvez pas omettre l'identifiant de l'argument positionnel avant :
, Utilisez donc
>>> '{0:08b}'.format(1)
'00000001'
Vous pouvez utiliser le langage mini de formatage de chaîne:
def binary(num, pre='0b', length=8, spacer=0):
return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])
Démo:
print binary(1)
Sortie:
'0b00000001'
Modifier: basé sur l'idée de @ Martijn Pieters
def binary(num, length=8):
return format(num, '#0{}b'.format(length + 2))
Parfois, vous voulez juste un simple liner:
binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])
Python 3
Vous pouvez utiliser quelque chose comme ceci
("{: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)
Vous pouvez utiliser zfill:
print str(1).zfill(2)
print str(10).zfill(2)
print str(100).zfill(2)
Impressions:
01
10
100
J'aime cette solution, car elle aide non seulement lors de la sortie du nombre, mais quand vous devez l'assigner à une variable... par exemple - x = str (datetime.date.aujourd'().mois).zfill (2)renverra x comme ' 02 ' pour le mois de février.