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?

Forgeron
la source
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'
eumiro
la source
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'
mshsayem
la source
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'
Sobel
la source
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>")
celui
la source
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
jedwards
la source
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'
thebjorn
la source
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))
Shadrack Kimutai
la source
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'
Tom Hale
la source
1
('0' * 7 + bin(6)[2:])[-8:]

ou

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side
zerg
la source
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)
ama
la source
1

encore plus simple

my_num = 6
print(f'{my_num:b}')
Raad Altaie
la source
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.

Pranjalya
la source
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)
Dmity Bryuhanov
la source
0

Vous pouvez utiliser uniquement:

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

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

Leha
la source