Entier de champ de bits comme une liste
J'ai créé une méthode pour convertir une int
à un champ de bits (dans une liste) et il fonctionne, mais je suis sûr qu'il est plus élégant de la solution - je viens de regarder pour longtemps.
Je suis curieux, comment voulez-vous convertir un int
à un champ de bits représentés dans un list
?
def get(self):
results = []
results.append(1 if (self.bits & 1) else 0)
results.append(1 if (self.bits & 2) else 0)
results.append(1 if (self.bits & 4) else 0)
results.append(1 if (self.bits & 8) else 0)
results.append(1 if (self.bits & 16) else 0)
results.append(1 if (self.bits & 32) else 0)
results.append(1 if (self.bits & 64) else 0)
results.append(1 if (self.bits & 128) else 0)
return results
def set(self, pin, direction):
pin -= 1
if pin not in range(0, 8): raise ValueError
if direction: self.bits |= (2 ** pin)
else: self.bits &=~(2 ** pin)
OriginalL'auteur tMC | 2012-04-25
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet:
Cela vous donne
Cela ne fonctionne que pour des entiers positifs.
EDIT:
Conversion
int
à l'aide deint()
est un peu exagéré ici. C'est beaucoup plus rapide:Voir les horaires:
[123 >> i & 1 for i in range(7,-1,-1)]
est le plus rapide sur ma machine.J'ai refait les timings à la fois sur mon Pc (Win 7 Ultimate 64bits), sous Python 2.7.3 et 3.2.3, et ma solution est toujours plus rapide d'au moins 20 % (Python 2) et 45 % (Python 3).
la différence est négligeable. J'ai juste pensé qu'il était intéressant que j'ai eu des résultats différents sur mon Linux ordinateur portable.
OriginalL'auteur Tim Pietzcker
Ce n'utilise pas
bin
:et ce est la façon de traiter tout entier de cette façon:
Voir
bit_length
.Si vous voulez de l'indice 0 de la liste pour correspondre à la lsb de l'int, modifier la plage de commande, c'est à dire
Remarque également que l'utilisation de n.bit_length() peut être un point de défaillance si vous essayez de représenter binaire de longueur fixe des valeurs. Elle renvoie le nombre minimum de bits pour représenter n.
Bien sûr, ce ne gère que 8 bits entiers.
Il peut gérer tout entiers dans cette façon: [n >> i & 1 for i in range(n.bit_length() - 1,-1,-1)]
merci, ajouté (btw, n'hésitez pas à éditer les messages si vous avez quelque chose de précieux à ajouter).
OriginalL'auteur georg
Essayer
Cela ne fonctionne pas pour le négatif n si et comme vous le voyez vous donne une liste de chaînes
list()
constructeur de tous les temps.Même si elle ne retourne pas de liste d'entiers.
Ce n'est pas ce que tMC a demandé. Il a besoin d'une liste d'entiers, vous lui donnez une liste de chaînes de caractères. Aussi beau que l'
list()
constructeur peut être, ce n'est pas le bon outil ici.Pietzcker - Vous avez raison.
Je suis d'accord et d'éditer ma réponse en conséquence
OriginalL'auteur snugglo
Je fais cela pour mon programme lorsque vous spécifiez un modèle pour obtenir vos valeurs à partir d'un int:
comment utiliser
dans le modèle, spécifier ints relatives à votre bit-tailles:
ou vous pouvez spécifier le nombre de bits de taille de chaque valeur à l'aide de cordes: (noob friendly)
EDIT: et vice versa: (code)
le code:
EDIT2: plus vite le code^
OriginalL'auteur Tcll