J'essaie de convertir un entier en binaire en utilisant la fonction bin () en Python. Cependant, il supprime toujours les zéros non significatifs, dont j'ai réellement besoin, de sorte que le résultat soit toujours 8 bits:
Exemple:
bin(1) -> 0b1
# What I would like:
bin(1) -> 0b00000001
Y-a-t'il une façon de le faire?
python
binary
formatting
bitwise-operators
Niels Sønderbæk
la source
la source
Réponses:
Utilisez la
format()
fonction :La
format()
fonction formate simplement l'entrée en suivant le mini-langage Format Specification . Le#
fait que le format inclut le0b
préfixe, et la010
taille formate la sortie pour qu'elle tienne dans une largeur de 10 caractères, avec un0
remplissage; 2 caractères pour le0b
préfixe, 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 une chaîne plus grande, utilisez un littéral de chaîne formaté (3.6+) ou utilisez
str.format()
et mettez le deuxième argument de laformat()
fonction après les deux points de l'espace réservé{:..}
:En l'occurrence, même pour simplement formater une seule valeur (donc sans mettre le résultat dans une chaîne plus grande), utiliser une chaîne littérale formatée est plus rapide que d'utiliser
format()
:Mais je n'utiliserais cela que si les performances dans une boucle serrée comptent, car elles
format(...)
communiquent mieux l'intention.Si vous ne vouliez pas le
0b
préfixe, déposez simplement le#
et ajustez la longueur du champ:la source
format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b')
11000000.00000000.00000010.00100001
str.format()
et mettez le deuxième argument pour la fonction format () après les deux points de l'espace réservé{:..}
:f"{192:08b}.{0:08b}.{2:08b}.{33:08b}"
.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 auparavant
:
, utilisez doncla source
str.format()
ici quandformat()
fera l'affaire. Il vous manque le0b
préfixe.str.format
est plus flexible queformat()
parce qu'il vous permettra de faire plusieurs variables à la fois. J'oublie toujours que laformat
fonction existe même. Certes, c'est parfaitement adéquat dans ce cas.str.format()
qu'un seul{}
élément, pas d'autre texte, vous n'utilisez pas de modèle de chaîne, vous formatez une valeur . Dans ce cas, utilisez simplementformat()
. :-)j'utilise
va imprimer
la source
Vous pouvez utiliser le mini-langage de formatage de chaîne:
Démo:
Production:
EDIT: basé sur l'idée de @Martijn Pieters
la source
#
. Il existe égalementformat()
, ce qui vous évite d'avoir à faire un modèle de chaîne complet.Lorsque vous utilisez Python
>= 3.6
, le moyen le plus simple est d'utiliser des chaînes f avec un formatage de chaîne :Explication:
var
la variable à formater:
tout après c'est le spécificateur de format#
utiliser la forme alternative (ajoute le0b
préfixe)0
pad avec des zéros10
pad à une longueur totale de 10 (cela inclut les 2 caractères pour0b
)b
utiliser une représentation binaire pour le nombrela source
format(var, "#010b")
communique beaucoup mieux l' intention . C'est cependant l'option la plus rapide. Mais vous le savez déjà, d'accord, parce que je couvre déjà tout ce que vous avez publié dans ma réponse.Parfois, vous voulez juste une simple doublure:
Python 3
la source
[ ]
ne devrait pas être nécessaire -join()
accepte une expression de générateur.''.join('{0:08b}'.format(ord(x)) for x in input)
str.join()
doit faire deux passes, une entrée de générateur est d'abord convertie en liste avant de se joindre. Cela pèse un peu sur les performances et il est en fait préférable de passer une compréhension de liste plutôt qu'une expression de générateur. C'est une si elles font exception à la règle.Vous pouvez utiliser quelque chose comme ça
la source
"{:0{l}b}".format(num, l=length)
vous pouvez utiliser la méthode de chaîne rjust de la syntaxe python: string.rjust (length, fillchar) fillchar est facultatif
et pour ta question tu peux écrire comme ça
donc ce sera '0b00000001'
la source
int
en sa représentation binaire textuelle; vous ne commencez même pas par unint
.Vous pouvez utiliser zfill:
imprime:
J'aime cette solution, car elle aide non seulement lors de la sortie du numéro, mais aussi lorsque vous devez l'assigner à une variable ... par exemple - x = str (datetime.date.today (). Month) .zfill (2) sera renvoie x comme «02» pour le mois de février.
la source
bin(14)
donne `` 0b1110 '' etbin(14).zfill(8)
donne `` 000b1110 '' et non `` 0b00001110 '' ce qui est souhaité