web-dev-qa-db-fra.com

Convertir en binaire et conserver les zéros non significatifs dans Python

J'essaie de convertir un entier en binaire à l'aide de la fonction bin () en Python. Cependant, il supprime toujours les zéros non significatifs, ce 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 une façon de le faire?

119

Utilisez la fonction format() :

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

La fonction format() formate simplement l'entrée en suivant le mini langage de spécification de format . Le # fait en sorte que le format inclue le préfixe 0b et la taille 010 formate la sortie pour qu'elle ait une largeur de 10 caractères, avec 0 padding; 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 placez le résultat dans une chaîne plus grande, utilisez un littéral de chaîne formaté (3.6+) ou utilisez str.format() et placez le deuxième argument de la fonction format() après les deux points de l'espace réservé {:..}:

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

En fait, même pour le formatage d’une seule valeur (sans mettre le résultat dans une chaîne plus longue), l’utilisation d’un littéral de chaîne formaté est plus rapide que celle de 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

Mais je ne l’utiliserais que si la performance dans une boucle étroite importait, car format(...) communiquait mieux l’intention.

Si vous ne voulez pas utiliser le préfixe 0b, supprimez simplement # et ajustez la longueur du champ:

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

Voir: Mini-langage de spécification de format


Remarque pour Python 2.6 ou version antérieure, vous ne pouvez pas omettre l'identificateur d'argument de position avant :, vous devez donc utiliser

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

J'utilise

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

imprimera

'00000001'
20
rekinyz

Vous pouvez utiliser le mini langage 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'

EDIT: basé sur l'idée de @Martijn Pieters

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

Parfois, vous voulez juste un simple liner:

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

Python 3

1
Mark

Vous pouvez utiliser quelque chose comme ça

("{:0%db}"%length).format(num)
0
Adam