Conversion d'entier en binaire en python


186

Afin de convertir un entier en binaire, j'ai utilisé ce code:

>>> bin(6)  
'0b110'

et quand effacer le '0b', j'utilise ceci:

>>> bin(6)[2:]  
'110'

Que puis-je faire si je souhaite afficher 6comme 00000110au lieu de 110?


2
Possible duplication de Python int en binaire?
Martin Thoma

Réponses:


370
>>> '{0:08b}'.format(6)
'00000110'

Juste pour expliquer les parties de la chaîne de formatage:

  • {} place une variable dans une chaîne
  • 0 prend la variable à la position 0 de l'argument
  • :ajoute des options de mise en forme pour cette variable (sinon elle représenterait décimal 6)
  • 08 met en forme le nombre à huit chiffres remplis de zéros à gauche
  • b convertit le nombre en sa représentation binaire

Si vous utilisez une version de Python 3.6 ou supérieure, vous pouvez également utiliser des chaînes f:

>>> f'{6:08b}'
'00000110'

7
Le premier 0signifie l' 0thargument de format. Après le deux-points est le formatage, le second 0signifie zéro remplissage à 8 espaces et bpour binaire
jamylak

@Aif: Jetez également un œil à la documentation standard docs.python.org/library
...

20
Cela peut être simplifiée avec la format() fonction : format(6, '08b'); la fonction prend une valeur (à quoi {..}s'applique le slot) et une spécification de formatage (tout ce que vous mettriez après le :dans la chaîne de formatage).
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'. et si vous ne voulez pas de signe? struct? -6%256?
n611x007

1
@ AK47 Oui, depuis Pythoon 2.6 vous pouvez écrire des constantes int sous forme binaire avec le préfixe 0b ou 0B: 0b00000110
Denis Barmenkov

102

Juste une autre idée:

>>> bin(6)[2:].zfill(8)
'00000110'

Chemin plus court via l' interpolation de chaîne ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'

7
Notez que cette solution est plus rapide que celle acceptée . Quelle solution est la plus claire (ou, oserais-je le dire, Pythonique) est probablement une question de goût personnel.
Air le

J'apprends toujours l'essence de la pythonicité, mais c'est clairement beaucoup plus polyvalent. J'étais initialement ravi de voir la solution acceptée avec son explication élégante, mais alarmé par le fait que l'objet appelé à faire les méthodes était écrit comme une seule chaîne avec toutes les spécifications intégrées, éliminant ainsi l'implication de variables dans des choses telles que la longueur souhaitée. de la chaîne de bits. Cela résout cela complètement et est si intuitif (au moins pour Python 2) qu'il n'est pas nécessaire d'expliquer chaque caractère!
Post169

Ne fonctionne pas pour un entier négatif se bin(-6)[2:].zfill(8)lit comme suit'0000b110'
jlandercy

20

Une méthode un peu bidouilleuse ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
Belle méthode. Mais je ne pouvais pas comprendre ce que faisait cette partie de votre code: str ((x >> i) & 1)
Gregory

2
@Gregory: il décale les bits xvers la droite et les ET avec 1, en extrayant effectivement un bit (0 ou 1) à la fois.
usr2564301

16

Utilisez simplement la fonction de format

format(6, "08b")

La forme générale est

format(<the_integer>, "<0><width_of_string><format_specifier>")

1
Oui, j'aime celui-ci, c'est simple et l'un des plus rapides :-) 1000000 loops, best of 3: 556 ns per loop
SebMa

10

La réponse d'eumiro est meilleure, mais je poste juste ceci pour la variété:

>>> "%08d" % int(bin(6)[2:])
00000110

3
Il h. C'est tellement faux, j'ai dû voter pour. Interpréter les chiffres comme des nombres décimaux est astucieux. Pire encore:'%08x' % int(bin(6)[2:], 16)
Mad Physicist

6

.. ou si vous n'êtes pas sûr qu'il doit toujours comporter 8 chiffres, vous pouvez le passer en paramètre:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

5

Going Old School fonctionne toujours

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))

number=number/2donne du flotteur, donc des number=number//2coutures meilleures, aussi je remplacerais number=number//2par number//=2et b=b+"0"parb+="0"
Brambor

De plus, vous n'avez pas le rembourrage 0 comme OP requis
Brambor

5

numpy.binary_repr(num, width=None) a un argument de largeur magique

Exemples pertinents tirés de la documentation liée ci-dessus:

>>> np.binary_repr(3, width=4)
'0011'

Le complément à deux est renvoyé lorsque le nombre d'entrée est négatif et que la largeur est spécifiée:

>>> np.binary_repr(-3, width=5)
'11101'

1
('0' * 7 + bin(6)[2:])[-8:]

ou

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side

3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Nic3500

1

En supposant que vous souhaitiez analyser le nombre de chiffres utilisés pour représenter à partir d'une variable qui n'est pas toujours constante, un bon moyen sera d'utiliser numpy.binary.

peut être utile lorsque vous appliquez des binaires à des ensembles de puissance

import numpy as np
np.binary_repr(6, width=8)


0

Le meilleur moyen est de spécifier le format.

format(a, 'b')

renvoie la valeur binaire de a au format chaîne.

Pour reconvertir une chaîne binaire en entier, utilisez la fonction int ().

int('110', 2)

renvoie la valeur entière de la chaîne binaire.


Le mieux serait le format (a, '08b') pour obtenir le format souhaité par l'utilisateur.
ZSG

0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)

0

Vous pouvez utiliser uniquement:

"{0:b}".format(n)

À mon avis, c'est le moyen le plus simple!

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.