Comment exprimer des littéraux binaires en Python ?
Question
Comment exprimer un entier sous forme de nombre binaire avec des littéraux Python ?
J'ai pu facilement trouver la réponse pour hex :
>>> 0x12AF
4783
>>> 0x100
256
et octal :
>>> 01267
695
>>> 0100
64
Comment utiliser des littéraux pour exprimer du binaire en Python ?
Résumé des réponses
- Python 2.5 et versions antérieures :peut exprimer du binaire en utilisant
int('01010101111',2)
mais pas avec un littéral. - Python 2.5 et versions antérieures :il y a certainement pas pour exprimer des littéraux binaires.
- Python 2.6 bêta :Vous pouvez faire comme ceci :
0b1100111
ou0B1100111
. - Python 2.6 bêta :permettra également
0o27
ou0O27
(le deuxième caractère est la lettre O) pour représenter un octal. - Python 3.0 bêta :Identique à la version 2.6, mais ne permettra plus aux anciens
027
syntaxe pour les octaux.
La solution
Pour référence-avenir Possibilités Python :
À partir de Python 2.6, vous pouvez exprimer des littéraux binaires en utilisant le préfixe 0b ou 0B:
>>> 0b101111
47
Vous pouvez également utiliser le nouveau poubelle fonction pour obtenir la représentation binaire d'un nombre :
>>> bin(173)
'0b10101101'
Version de développement de la documentation : Quoi de neuf dans Python 2.6
Autres conseils
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255
Autrement.
Comment exprimer des littéraux binaires en Python ?
Ce ne sont pas des littéraux « binaires », mais plutôt des « littéraux entiers ».Vous pouvez exprimer des littéraux entiers au format binaire avec un 0
suivi d'un B
ou b
suivi d'une série de zéros et de uns, par exemple :
>>> 0b0010101010
170
>>> 0B010101
21
Depuis Python 3 documents, voici les manières de fournir des littéraux entiers en Python :
Les littéraux entiers sont décrits par les définitions lexicales suivantes :
integer ::= decinteger | bininteger | octinteger | hexinteger decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")* bininteger ::= "0" ("b" | "B") (["_"] bindigit)+ octinteger ::= "0" ("o" | "O") (["_"] octdigit)+ hexinteger ::= "0" ("x" | "X") (["_"] hexdigit)+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" bindigit ::= "0" | "1" octdigit ::= "0"..."7" hexdigit ::= digit | "a"..."f" | "A"..."F"
Il n'y a pas de limite pour la longueur des littéraux entiers en dehors de ce qui peut être stocké dans la mémoire disponible.
Notez que les zéros non significatifs dans un nombre décimal différent de zéro ne sont pas autorisés.C'est pour la désambiguïsation avec les littéraux octaux de style C, que Python a utilisé avant la version 3.0.
Quelques exemples de littéraux entiers :
7 2147483647 0o177 0b100110111 3 79228162514264337593543950336 0o377 0xdeadbeef 100_000_000_000 0b_1110_0101
Modifié dans la version 3.6 : Les traits de soulignement sont désormais autorisés à des fins de regroupement en littéraux.
Autres façons d'exprimer le binaire :
Vous pouvez avoir les zéros et les uns dans un objet chaîne qui peut être manipulé (bien que vous devriez probablement simplement effectuer des opérations au niveau du bit sur l'entier dans la plupart des cas) - transmettez simplement la chaîne de zéros et de uns et la base à partir de laquelle vous convertissez (2 ) :
>>> int('010101', 2)
21
Vous pouvez éventuellement avoir le 0b
ou 0B
préfixe:
>>> int('0b0010101010', 2)
170
Si tu le réussis 0
comme base, il prendra la base 10 si la chaîne ne spécifie pas de préfixe :
>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21
Conversion de int en binaire lisible par l'homme :
Vous pouvez transmettre un entier à bin pour voir la représentation sous forme de chaîne d'un littéral binaire :
>>> bin(21)
'0b10101'
Et vous pouvez combiner bin
et int
faire des allers-retours :
>>> bin(int('010101', 2))
'0b10101'
Vous pouvez également utiliser une spécification de format si vous souhaitez avoir une largeur minimale précédée de zéros :
>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'
0 au début ici spécifie que la base est 8 (et non 10), ce qui est assez facile à voir :
>>> int('010101', 0)
4161
Si vous ne commencez pas par 0, alors python suppose que le nombre est en base 10.
>>> int('10101', 0)
10101
Pour autant que je sache, Python, jusqu'à la version 2.5, ne prend en charge que les littéraux hexadécimaux et octaux.J'ai trouvé quelques discussions sur l'ajout de binaires aux futures versions, mais rien de précis.
Je suis presque sûr que c'est l'une des choses qui doivent changer dans Python 3.0 avec peut-être bin() pour aller avec hex() et oct().
MODIFIER:La réponse de lbrandy est correcte dans tous les cas.