Comment exprimez-vous les littéraux binaires en Python?


351

Comment exprimez-vous 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 utilisez-vous les littéraux pour exprimer le binaire en Python?


Résumé des réponses

  • Python 2.5 et versions antérieures: peut exprimer le binaire en utilisant int('01010101111',2)mais pas avec un littéral.
  • Python 2.5 et versions antérieures: il n'y a aucun moyen d'exprimer des littéraux binaires.
  • Python 2.6 beta: Vous pouvez faire comme ça: 0b1100111ou 0B1100111.
  • Python 2.6 beta: permettra également à 0o27ou 0O27(le deuxième caractère est la lettre O) de représenter un octal.
  • Python 3.0 beta: Identique à 2.6, mais n'autorisera plus l'ancienne 027syntaxe pour les octales.

Réponses:


291

Pour référence - futures 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 la nouvelle fonction bin pour obtenir la représentation binaire d'un nombre:

>>> bin(173)
'0b10101101'

Version de développement de la documentation: Nouveautés de Python 2.6


72
>>> print int('01010101111',2)
687
>>> print int('11111111',2)
255

Autrement.


2
C'est intéressant lorsque vous avez des chaînes, mais si vous travaillez avec des nombres purs, vous ajoutez des calculs inutiles au code.
Daniel Möller

28

Comment exprimez-vous les 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 0suivi d'un Bou bsuivi d'une série de zéros et de uns, par exemple:

>>> 0b0010101010
170
>>> 0B010101
21

De l'python 3 documents , ce sont les moyens de fournir des littéraux entiers dans le 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 non nul ne sont pas autorisés. C'est pour la désambiguïsation avec les littéraux octaux de style C, que Python utilisait 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) - passez simplement entre 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 préfixe 0bou 0B:

>>> int('0b0010101010', 2)
170

Si vous le passez 0comme base, il prendra la base 10 si la chaîne ne spécifie pas avec un préfixe:

>>> int('10101', 0)
10101
>>> int('0b10101', 0)
21

Conversion de int retour en binaire lisible par l'homme:

Vous pouvez passer 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 binet intaller et venir:

>>> bin(int('010101', 2))
'0b10101'

Vous pouvez également utiliser une spécification de format, si vous souhaitez avoir une largeur minimale avec des zéros précédents:

>>> format(int('010101', 2), '{fill}{width}b'.format(width=10, fill=0))
'0000010101'
>>> format(int('010101', 2), '010b')
'0000010101'

2

0 au début ici spécifie que la base est 8 (pas 10), ce qui est assez facile à voir:

>>> int('010101', 0)
4161

Si vous ne commencez pas par un 0, python suppose que le nombre est en base 10.

>>> int('10101', 0)
10101

-1

Pour autant que je sache, Python, jusqu'à 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.


-3

Je suis à peu près sûr que c'est l'une des choses dues au changement dans Python 3.0 avec peut-être bin () pour aller avec hex () et oct ().

EDIT: la réponse de lbrandy est correcte dans tous les cas.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.