str.format()formater une seule valeur est exagéré. Aller directement à la format()fonction : format(n, 'b'). Il n'est pas nécessaire d'analyser l'espace réservé et de le faire correspondre à un argument, passez directement à l'opération de formatage de la valeur elle-même. À utiliser uniquement str.format()si vous devez placer le résultat formaté dans une chaîne plus longue (par exemple, l'utiliser comme modèle).
Martijn Pieters
29
@mike: ou utilisez la spécification de formatage. Ajoutez le nombre de chiffres avec un début 0à la chaîne de formatage: format(10, '016b')formate à 16 chiffres avec des zéros en tête.
Martijn Pieters
Dans ce cas, l' 0entrée "{0:b}"peut être supprimée non? Je veux dire, dans le cas où un seul nombre est formaté, il est correct de le mettre "{:b}", n'est-ce pas?
tomasyany
1
en général, on utilise une représentation de 4/8 / ... bits:"{:08b}".format(37)
Sparkler
2
f "{37: b}" en Python3.7 ou version ultérieure.
DA
471
Si vous recherchez bin()un équivalent àhex() , il a été ajouté en python 2.6.
Notez également qu'il est plus rapide à faire str(bin(i))[2:](0,369s pour 1000000ops) que "{0:b}".format(i)(0,721s pour 1000000ops)
mVChr
64
@mVChr si quelqu'un convertit des nombres en représentation binaire ASCII, j'espère vraiment que la vitesse n'a pas d'importance.
Nick T
29
@mVChr: str.format()est de toute façon le mauvais outil, vous utiliseriez à la format(i, 'b')place. Tenez compte du fait que cela vous donne également des options de rembourrage et d'alignement; format(i, '016b')pour formater en un nombre binaire 16 bits à remplissage nul. Pour faire de même avec bin()vous devez ajouter un str.zfill()appel: bin(i)[2:].zfill(16)(pas besoin d'appeler str()!). format()La lisibilité et la flexibilité de (la mise en forme dynamique est beaucoup plus difficile avec bin()) sont de bons compromis, n'optimisez pas les performances à moins que vous ne deviez le faire, jusque-là optimisez pour la maintenabilité.
Martijn Pieters
Que signifie [2:]?
zero_cool
4
Bien sûr, avec python 3.6+, vous pouvez maintenant utiliser f"{37:b}".
Luke Davis
63
Python a en fait quelque chose de déjà intégré pour cela, la possibilité d'effectuer des opérations telles que '{0:b}'.format(42), qui vous donnera le modèle de bits (dans une chaîne) pour 42, ou 101010.
Pour une philosophie plus générale, aucune langue ou bibliothèque ne donnera à sa base d'utilisateurs tout ce qu'elle désire. Si vous travaillez dans un environnement qui ne fournit pas exactement ce dont vous avez besoin, vous devez collecter des extraits de code au fur et à mesure de votre développement pour vous assurer de ne jamais avoir à écrire deux fois la même chose. Tels que, par exemple, le pseudo-code:
define intToBinString, receiving intVal:if intVal is equal to zero:return"0"
set strVal to ""while intVal is greater than zero:if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
qui construira votre chaîne binaire en fonction de la valeur décimale. Gardez à l'esprit que c'est un peu générique de pseudo-code qui n'est peut-être pas le plus efficace de le faire, avec les itérations que vous semblez proposer, cela ne fera pas beaucoup de différence. Il s'agit simplement d'une ligne directrice sur la façon de le faire.
L'idée générale est d'utiliser du code de (par ordre de préférence):
la langue ou les bibliothèques intégrées.
bibliothèques tierces avec des licences appropriées.
votre propre collection.
quelque chose de nouveau que vous devez écrire (et enregistrer dans votre propre collection pour plus tard).
Quelques bons conseils dans cette réponse. Dommage que le code soit inutilement lent. Vous proposez un algo O (N ^ 2) où un O (N) ferait l'affaire. La partie problématique est dans les lignes s = "1" + set s = "0" + s. Chacun fait une copie inutile du par. Vous devez inverser la chaîne juste avant de la renvoyer à la place.
Andreas Magnusson
@Andreas, ce que j'ai proposé était d'utiliser '{0:b}'.format(42), la méthode lente était simplement un exemple de la façon de le faire de manière générique, qui peut ou non être O (n ^ 2) selon la langue réelle utilisée. Il ne ressemble qu'à Python puisque Python est un langage de pseudo-code idéal, donc je vais changer cela pour que ce soit clair.
paxdiablo
En fait, ce serait un langage assez ésotérique où s = "1" + sn'était pas O (N) quand sest un type chaîne. Peut-être une langue dans laquelle toutes les chaînes sont stockées à l'envers ou chaque caractère est un nœud dans une liste chaînée? Pour toute langue typique, une chaîne est essentiellement un tableau de caractères. Dans ce cas, le préfixe d'une chaîne nécessite qu'une copie soit faite, comment allez-vous mettre le caractère avant les autres caractères?
Andreas Magnusson
Je peux facilement envisager un type de chaîne qui se compose d'un bloc de mémoire où la chaîne est justifiée à droite dans ce bloc et d'un décalage par rapport à son caractère de départ. Pour préfixer un caractère, vous devez alors simplement réduire le décalage et y stocker le caractère. Oui, ce serait ésotérique, mais cela n'a guère de sens pour moi de discuter d'éventuels problèmes dans le monde réel avec un peu de pseudo-code, d' autant plus que vous n'avez probablement pas plus de quelques dizaines de bits / itérations. Même le type de bulle très décrié est adéquat si la taille de vos données est petite :-) Dans tous les cas, je vais ajouter une note sur l'efficacité.
paxdiablo
Bien sûr, si l'efficacité est importante, vous ne choisiriez probablement pas python pour commencer. D'après mon expérience, il arrive assez souvent que le code qui a été écrit naïvement à l'aide d'un algo O (N²) et testé avec un petit ensemble de données soit rapidement utilisé avec un ensemble de données beaucoup plus grand car "il semble fonctionner". Puis tout d'un coup, vous avez du code qui prend des heures à s'exécuter et qui, une fois corrigé, ne peut prendre que quelques secondes. Les algos O (N²) sont insidieux car ils semblent fonctionner pendant un certain temps, mais lorsque vos données évoluent, ils ne le font pas et d'ici là, le gars qui les a écrits a quitté et personne ne sait pourquoi les choses prennent une éternité.
Andreas Magnusson
41
Si vous voulez une représentation textuelle sans le préfixe 0b, vous pouvez utiliser ceci:
Alternativement, si vous préférez avoir une fonction:
def get_bin(x, n=0):"""
Get the binary representation of x.
Parameters
----------
x : int
n : int
Minimum number of digits. If x needs less digits in binary, the rest
is filled with zeros.
Returns
-------
str
"""return format(x,'b').zfill(n)
Ou utilisez simplement format(integer, 'b'). bin()est un outil de débogage, spécifiquement destiné à produire la syntaxe littérale d'entier binaire Python , format()est destiné à produire des formats spécifiques.
Martijn Pieters
1
@MartijnPieters Merci beaucoup de l'avoir mentionné. J'ai ajusté ma solutution. Comment savez-vous qu'il bin()s'agit d'un outil de débogage visant à produire la syntaxe littérale d'entier binaire Python? Je n'ai pas trouvé cela dans la documentation.
Martin Thoma
2
De la documentation: Le résultat est une expression Python valide . Son objectif est de produire une expression Python, pas de produire des représentations d'utilisateur final. Il en va de même pour oct()et hex().
Martijn Pieters
4
Plus d'alternatives: Si vous souhaitez rendre la largeur dynamique, str.zfill()vous pouvez utiliser str.format()ou format()avec un deuxième argument dynamique: '{0:0{1}b}'.format(x, n)ou format(b, '0{}b'.format(n)).
Martijn Pieters
@MartijnPieters Wow, merci beaucoup pour cette contribution! Je ne savais pas que c'était possible avec le format. Cependant, je pense que ma réponse actuelle zfillest plus facile à lire et à comprendre que le deuxième argument dynamique, donc je vais garder cela.
Martin Thoma
38
Pour référence:
def toBinary(n):return''.join(str(1& int(n)>> i)for i in range(64)[::-1])
Cette fonction peut convertir un entier positif aussi grand que 18446744073709551615, représenté par une chaîne '1111111111111111111111111111111111111111111111111111111111111111'.
Il peut être modifié pour servir un entier beaucoup plus grand, bien qu'il ne soit pas aussi pratique que "{0:b}".format()ou bin().
qui retourne '' pour 0 cependant. La représentation normale de 0 ne serait-elle pas «0»?
dietbacon
si vous voulez voir ce 0 :), vous pouvez le remplacer ''par '0', mais cela ajoutera un 0 de tête pour n'importe quel nombre.
Aziz Alto
11
Résumé des alternatives:
n=42assert"-101010"== format(-n,'b')assert"-101010"=="{0:b}".format(-n)assert"-101010"==(lambda x: x >=0and str(bin(x))[2:]or"-"+ str(bin(x))[3:])(-n)assert"0b101010"== bin(n)assert"101010"== bin(n)[2:]# But this won't work for negative numbers.
str.format()formater une seule valeur est exagéré. Aller directement à la format()fonction: format(n, 'b'). Pas besoin d'analyser l'espace réservé et de le faire correspondre à un argument de cette façon.
Martijn Pieters
10
Comme les réponses précédentes utilisaient principalement le format (), voici une implémentation de f-string.
Utilisant numpy pack / unpackbits, ils sont vos meilleurs amis.
Examples-------->>> a = np.array([[2],[7],[23]], dtype=np.uint8)>>> a
array([[2],[7],[23]], dtype=uint8)>>> b = np.unpackbits(a, axis=1)>>> b
array([[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,1,1],[0,0,0,1,0,1,1,1]], dtype=uint8)
La question concerne une représentation sous forme de chaîne . Pourtant, c'est exactement ce que je cherchais sans passer par la chaîne! :)
Tom Hale
Le doco dit: Décompresse les éléments d'un uint8tableau dans un tableau de sortie à valeur binaire. Tellement bon pour des valeurs jusqu'à 255.
Tom Hale
5
Pour ceux d'entre nous qui ont besoin de convertir des entiers signés (plage -2 ** (chiffres-1) en 2 ** (chiffres-1) -1) en chaînes binaires complémentaires de 2, cela fonctionne:
La deuxième version n'est certainement pas plus rapide car vous vous retrouvez avec quelque chose comme un algorithme O (N ^ 2) au lieu d'un O (N). J'ai vu des choses comme ça tuer une application (en termes de performances) parce que le développeur pensait que faire une passe supplémentaire à la fin était plus lent que de faire des choses supplémentaires dans la première boucle. Une fois réparé, le temps de fonctionnement passe de quelques jours à quelques secondes.
Voici le code que je viens d'implémenter. Ce n'est pas une méthode mais vous pouvez l'utiliser comme une fonction prête à l'emploi !
def inttobinary(number):if number ==0:return str(0)
result =""while(number !=0):
remainder = number%2
number = number/2
result += str(remainder)return result[::-1]# to invert the string
Voici encore une autre façon d'utiliser les mathématiques régulières, pas de boucles, seulement la récursivité. (Le cas trivial 0 ne renvoie rien).
def toBin(num):if num ==0:return""return toBin(num//2)+ str(num%2)print([(toBin(i))for i in range(10)])['','1','10','11','100','101','110','111','1000','1001']
Calculatrice avec toutes les fonctions nécessaires pour DEC, BIN, HEX: (fabriqué et testé avec Python 3.5)
Vous pouvez modifier les numéros de test d'entrée et obtenir ceux convertis.
# CONVERTER: DEC / BIN / HEXdef dec2bin(d):# dec -> bin
b = bin(d)return b
def dec2hex(d):# dec -> hex
h = hex(d)return h
def bin2dec(b):# bin -> dec
bin_numb="{0:b}".format(b)
d = eval(bin_numb)return d,bin_numb
def bin2hex(b):# bin -> hex
h = hex(b)return h
def hex2dec(h):# hex -> dec
d = int(h)return d
def hex2bin(h):# hex -> bin
b = bin(h)return b
## TESTING NUMBERS
numb_dec =99
numb_bin =0b0111
numb_hex =0xFF## CALCULATIONS
res_dec2bin = dec2bin(numb_dec)
res_dec2hex = dec2hex(numb_dec)
res_bin2dec,bin_numb = bin2dec(numb_bin)
res_bin2hex = bin2hex(numb_bin)
res_hex2dec = hex2dec(numb_hex)
res_hex2bin = hex2bin(numb_hex)## PRINTINGprint('------- DECIMAL to BIN / HEX -------\n')print('decimal:',numb_dec,'\nbin: ',res_dec2bin,'\nhex: ',res_dec2hex,'\n')print('------- BINARY to DEC / HEX -------\n')print('binary: ',bin_numb,'\ndec: ',numb_bin,'\nhex: ',res_bin2hex,'\n')print('----- HEXADECIMAL to BIN / HEX -----\n')print('hexadec:',hex(numb_hex),'\nbin: ',res_hex2bin,'\ndec: ',res_hex2dec,'\n')
Réponses:
La méthode de format de chaîne de Python peut prendre une spécification de format.
Formater les documents de spécification pour Python 2
Formater les documents de spécification pour Python 3
la source
str.format()
formater une seule valeur est exagéré. Aller directement à laformat()
fonction :format(n, 'b')
. Il n'est pas nécessaire d'analyser l'espace réservé et de le faire correspondre à un argument, passez directement à l'opération de formatage de la valeur elle-même. À utiliser uniquementstr.format()
si vous devez placer le résultat formaté dans une chaîne plus longue (par exemple, l'utiliser comme modèle).0
à la chaîne de formatage:format(10, '016b')
formate à 16 chiffres avec des zéros en tête.0
entrée"{0:b}"
peut être supprimée non? Je veux dire, dans le cas où un seul nombre est formaté, il est correct de le mettre"{:b}"
, n'est-ce pas?"{:08b}".format(37)
Si vous recherchez
bin()
un équivalent àhex()
, il a été ajouté en python 2.6.Exemple:
la source
str(bin(i))[2:]
(0,369s pour 1000000ops) que"{0:b}".format(i)
(0,721s pour 1000000ops)str.format()
est de toute façon le mauvais outil, vous utiliseriez à laformat(i, 'b')
place. Tenez compte du fait que cela vous donne également des options de rembourrage et d'alignement;format(i, '016b')
pour formater en un nombre binaire 16 bits à remplissage nul. Pour faire de même avecbin()
vous devez ajouter unstr.zfill()
appel:bin(i)[2:].zfill(16)
(pas besoin d'appelerstr()
!).format()
La lisibilité et la flexibilité de (la mise en forme dynamique est beaucoup plus difficile avecbin()
) sont de bons compromis, n'optimisez pas les performances à moins que vous ne deviez le faire, jusque-là optimisez pour la maintenabilité.f"{37:b}"
.Python a en fait quelque chose de déjà intégré pour cela, la possibilité d'effectuer des opérations telles que
'{0:b}'.format(42)
, qui vous donnera le modèle de bits (dans une chaîne) pour42
, ou101010
.Pour une philosophie plus générale, aucune langue ou bibliothèque ne donnera à sa base d'utilisateurs tout ce qu'elle désire. Si vous travaillez dans un environnement qui ne fournit pas exactement ce dont vous avez besoin, vous devez collecter des extraits de code au fur et à mesure de votre développement pour vous assurer de ne jamais avoir à écrire deux fois la même chose. Tels que, par exemple, le pseudo-code:
qui construira votre chaîne binaire en fonction de la valeur décimale. Gardez à l'esprit que c'est un peu générique de pseudo-code qui n'est peut-être pas le plus efficace de le faire, avec les itérations que vous semblez proposer, cela ne fera pas beaucoup de différence. Il s'agit simplement d'une ligne directrice sur la façon de le faire.
L'idée générale est d'utiliser du code de (par ordre de préférence):
la source
s = "1" + s
ets = "0" + s
. Chacun fait une copie inutile du par. Vous devez inverser la chaîne juste avant de la renvoyer à la place.'{0:b}'.format(42)
, la méthode lente était simplement un exemple de la façon de le faire de manière générique, qui peut ou non être O (n ^ 2) selon la langue réelle utilisée. Il ne ressemble qu'à Python puisque Python est un langage de pseudo-code idéal, donc je vais changer cela pour que ce soit clair.s = "1" + s
n'était pas O (N) quands
est un type chaîne. Peut-être une langue dans laquelle toutes les chaînes sont stockées à l'envers ou chaque caractère est un nœud dans une liste chaînée? Pour toute langue typique, une chaîne est essentiellement un tableau de caractères. Dans ce cas, le préfixe d'une chaîne nécessite qu'une copie soit faite, comment allez-vous mettre le caractère avant les autres caractères?Si vous voulez une représentation textuelle sans le préfixe 0b, vous pouvez utiliser ceci:
Lorsque vous souhaitez une représentation à n bits:
Alternativement, si vous préférez avoir une fonction:
la source
format(integer, 'b')
.bin()
est un outil de débogage, spécifiquement destiné à produire la syntaxe littérale d'entier binaire Python ,format()
est destiné à produire des formats spécifiques.bin()
s'agit d'un outil de débogage visant à produire la syntaxe littérale d'entier binaire Python? Je n'ai pas trouvé cela dans la documentation.oct()
ethex()
.str.zfill()
vous pouvez utiliserstr.format()
ouformat()
avec un deuxième argument dynamique:'{0:0{1}b}'.format(x, n)
ouformat(b, '0{}b'.format(n))
.zfill
est plus facile à lire et à comprendre que le deuxième argument dynamique, donc je vais garder cela.Pour référence:
Cette fonction peut convertir un entier positif aussi grand que
18446744073709551615
, représenté par une chaîne'1111111111111111111111111111111111111111111111111111111111111111'
.Il peut être modifié pour servir un entier beaucoup plus grand, bien qu'il ne soit pas aussi pratique que
"{0:b}".format()
oubin()
.la source
Un moyen simple de le faire est d'utiliser le format de chaîne, voir cette page .
Et si vous voulez avoir une longueur fixe de la chaîne binaire, vous pouvez utiliser ceci:
Si le complément à deux est requis, la ligne suivante peut être utilisée:
où n est la largeur de la chaîne binaire.
la source
C'est pour python 3 et il garde les zéros de tête!
la source
one-liner avec lambda :
tester:
ÉDITER :
mais alors :(
en comparaison avec
la source
''
par'0'
, mais cela ajoutera un 0 de tête pour n'importe quel nombre.Résumé des alternatives:
Les contributeurs incluent John Fouhy , Tung Nguyen , mVChr , Martin Thoma . et Martijn Pieters.
la source
str.format()
formater une seule valeur est exagéré. Aller directement à laformat()
fonction:format(n, 'b')
. Pas besoin d'analyser l'espace réservé et de le faire correspondre à un argument de cette façon.Comme les réponses précédentes utilisaient principalement le format (), voici une implémentation de f-string.
Production:
Pour plus de commodité, voici le lien des documents python pour les littéraux de chaîne formatés: https://docs.python.org/3/reference/lexical_analysis.html#f-strings .
la source
la source
Utilisant numpy pack / unpackbits, ils sont vos meilleurs amis.
la source
uint8
tableau dans un tableau de sortie à valeur binaire. Tellement bon pour des valeurs jusqu'à 255.Pour ceux d'entre nous qui ont besoin de convertir des entiers signés (plage -2 ** (chiffres-1) en 2 ** (chiffres-1) -1) en chaînes binaires complémentaires de 2, cela fonctionne:
Cela produit:
la source
À moins que je ne comprenne mal ce que vous entendez par chaîne binaire, je pense que le module que vous recherchez est struct
la source
Encore une autre solution avec un autre algorithme, en utilisant des opérateurs au niveau du bit.
Une version plus rapide sans inverser la chaîne.
la source
production:
la source
vous pouvez faire comme ça:
ou :
la source
Voici le code que je viens d'implémenter. Ce n'est pas une méthode mais vous pouvez l'utiliser comme une fonction prête à l'emploi !
la source
voici une solution simple utilisant la fonction divmod () qui retourne le rappel et le résultat d'une division sans la fraction.
la source
dectobin(10)
abouti à '0101'la source
numpy.binary_repr(num, width=None)
Exemples du lien de documentation ci-dessus:
la source
Solution assez similaire
la source
Voici encore une autre façon d'utiliser les mathématiques régulières, pas de boucles, seulement la récursivité. (Le cas trivial 0 ne renvoie rien).
la source
Calculatrice avec toutes les fonctions nécessaires pour DEC, BIN, HEX: (fabriqué et testé avec Python 3.5)
Vous pouvez modifier les numéros de test d'entrée et obtenir ceux convertis.
la source
la source
Si vous êtes prêt à abandonner Python "pur" mais à gagner beaucoup de puissance de feu, il y a Sage - exemple ici :
Vous remarquerez qu'il retourne sous forme de chaîne, donc pour l'utiliser comme un nombre, vous voudriez faire quelque chose comme
la source
la source
J'ai trouvé une méthode utilisant une opération matricielle pour convertir des décimales en binaires.
E
est l'entrée des données décimales,M
est les ordres binaires.bindata
est une sortie de données binaires, au format 1 par M matrice binaire.la source
Voici un simple convertisseur binaire en décimal qui boucle en continu
la source
C'est ma réponse ça marche bien ..!
la source
0
? Par exemple,binary(0)
obtiendrez-vous ce que vous attendez?