Convertir binaire à la liste de chiffres Python
J'ai le scénario suivant:
x = 0b0111
Je voudrais le convertir cette valeur:
y = [0, 1, 1, 1]
Quand je convertir x = 0b1001
, je peux obtenir y = [1, 0, 0, 1]
, mais quand j'essaie de faire de même pour x = 0b0111
, puis de les convertir en arrière avec str(bin(y))
- je semble perdre de le premier 0
, et obtenir 0b111
.
Des suggestions?
0b0111 == 0b111
quel est donc le problème? Si vous avez besoin de la liste de longueur fixe, puis il suffit de virer de bord sur le montant approprié de 0 au début.
InformationsquelleAutor user1656238 | 2012-10-26
Vous devez vous connecter pour publier un commentaire.
Une fois que vous obtenez cette chaîne
0b111
, il est simple de diviser les chiffres qui vous intéressent. Pour chaque caractère de tout ce qui est après le0b
dans la chaîne, de les convertir en un nombre entier.Pour ce que ça vaut, c'est une pure arithmétique solution semble être légèrement plus rapide:
2019 mise à jour: En python 3.7.3 la deuxième version est un peu plus rapide.
list
de l'intérieur de lamap
à l'extérieur de lamap
. Vous pouvez aussi gagner un peu de performance en utilisantb.append(n&1)
plutôt queb = [n & 1] + b
. Malheureusement(?) dans mon cas, lebits2
option est 10 fois plus rapide que la version pure.bits2
version éditée. Dans py3, c'est légèrement plus rapide, mais pas autant que 10x.D'abord convertir le nombre binaire, puis à la chaîne:
Ensuite, retirez le
0b
de la chaîneEnfin, nous utilisons compréhension de liste pour créer une liste d'entiers à partir de la chaîne, qui a environ la forme suivante:
Une expression comme
map(int, list(bin((1<<8)+x))[-4:])
vous donnera le bas 4 bits d'un nombre sous la forme d'une liste. (Edit: Un nettoyeur de forme estmap(int,bin(x)[2:].zfill(4))
; voir ci-dessous.) Si vous savez combien de bits que vous souhaitez montrer, remplacer les 4 (en[-4:]
) avec ce nombre; et de faire le 8 (en(1<<8)
) un plus grand nombre si nécessaire. Par exemple:Le dernier exemple ci-dessus montre une alternative à l'utilisation de la carte et de la liste. Les exemples suivants montrent un peu plus propre formulaire pour obtenir des zéros à gauche. Dans ces formes, la substitution de la désirée nombre minimum de bits au lieu de 8.
cochez cette façon simple de le faire... pour ce scénario particulier
donc, si l'élément dans la liste c est 3, 0 est inséré en premier.
Si la longueur de bits est fixé à
4
, il y a deux solutions:ou avec NumPy,
Pas très pythonian mais:
il utilise bitmasking "extrait" chaque bit et l'ajouter à un tableau.
Donné un certain nombre
value
et le nombre de bits pour représenter danswidth
:C'est environ un tiers plus rapide que
binary_list = [int(c) for c in string]