Convertir la chaîne de nombres binaires base-2 en int

306

Je voudrais simplement convertir une chaîne de nombres binaires base-2 en entier, quelque chose comme ceci:

>>> '11111111'.fromBinaryToInt()
255

Existe-t-il un moyen de le faire en Python?

Naftuli Kay
la source
3
Bien que cela n'ait pas vraiment d'importance, une chaîne binaire signifie généralement une chaîne contenant des données binaires réelles (un octet contient deux chiffres hexadécimaux, c'est-à-dire que "\ x00" est un octet nul).
trevorKirkby

Réponses:

563

Vous utilisez la intfonction intégrée et lui passez la base du numéro d'entrée, c'est- 2à- dire pour un nombre binaire:

>>> int('11111111', 2)
255

Voici la documentation de python2 et de python3 .

se détendre
la source
61
Au cas où quelqu'un chercherait le contraire: bin(255)-> '0b11111111'. Voir cette réponse pour plus de détails.
Akseli Palén
7
Il convient de noter que cela ne fonctionne que pour les entiers binaires non signés. Pour les entiers signés, les options de conversion sont un gâchis.
Fake Name du
2
Comment faire cela en python 3?
Saras Arya
2
@SarasArya C'est très similaire! :) J'ai mis à jour, voir ci-dessus.
détendre le
1
Et notez que dans une session REPL interactive (comme suggéré par l' >>>invite), vous n'avez pas besoin du tout d'utiliser print. L'exemple hypothétique du PO ne l'a pas fait. Donc, il devrait vraiment être identique en Python 2 et 3.
John Y
37

Tapez simplement 0b11111111 dans l'interface interactive python:

>>> 0b11111111
    255
lengxuehx
la source
28

Une autre façon de le faire est d'utiliser le bitstringmodule:

>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255

Notez que l'entier non signé est différent de l'entier signé:

>>> b.int
-1

Le bitstringmodule n'est pas une exigence, mais il a beaucoup de méthodes performantes pour transformer l'entrée en et à partir de bits dans d'autres formes, ainsi que pour les manipuler.

Alex Reynolds
la source
8

Utiliser int avec base est la bonne solution. J'avais l'habitude de le faire avant de trouver également la base int. Il s'agit essentiellement d'une réduction appliquée sur une liste de compréhension de la manière primitive de convertir le binaire en décimal (par exemple 110 = 2 ** 0 * 0 + 2 ** 1 * 1 + 2 ** 2 * 1)

add = lambda x,y : x + y
reduce(add, [int(x) * 2 ** y for x, y in zip(list(binstr), range(len(binstr) - 1, -1, -1))])
Saurabh Hirani
la source
4
Au lieu de définir add = lambda x, y: x + y, int.__add__on peut prévoir de réduire. Par exemplereduce(int.__add__, ...)
Jordan Jambazov
4

Si vous voulez savoir ce qui se passe derrière la scène, alors c'est parti.

class Binary():
def __init__(self, binNumber):
    self._binNumber = binNumber
    self._binNumber = self._binNumber[::-1]
    self._binNumber = list(self._binNumber)
    self._x = [1]
    self._count = 1
    self._change = 2
    self._amount = 0
    print(self._ToNumber(self._binNumber))
def _ToNumber(self, number):
    self._number = number
    for i in range (1, len (self._number)):
        self._total = self._count * self._change
        self._count = self._total
        self._x.append(self._count)
    self._deep = zip(self._number, self._x)
    for self._k, self._v in self._deep:
        if self._k == '1':
            self._amount += self._v
    return self._amount
mo = Binary('101111110')
Mohammad Mahjoub
la source
3

Une implémentation récursive de Python:

def int2bin(n):
    return int2bin(n >> 1) + [n & 1] if n > 1 else [1] 
Ludovic Trottier
la source
1

Si vous utilisez python3.6 ou version ultérieure, vous pouvez utiliser la chaîne f pour effectuer la conversion:

Binaire à décimal:

>>> print(f'{0b1011010:#0}')
90

>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90

hexa binaire à octal et etc.

>>> f'{0b1011010:#o}'
'0o132'  # octal

>>> f'{0b1011010:#x}'
'0x5a'   # hexadecimal

>>> f'{0b1011010:#0}'
'90'     # decimal

Faites attention à 2 informations séparées par deux points.

De cette façon, vous pouvez convertir entre {binaire, octal, hexadécimal, décimal} en {binaire, octal, hexadécimal, décimal} en changeant le côté droit des deux points [:]

:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal 
:#0 -> converts to decimal as above example

Essayez de changer le côté gauche du côlon pour avoir octal / hexadécimal / décimal.

Robert Ranjan
la source
0

Pour les grandes matrices (10 ** 5 lignes et plus), il est préférable d'utiliser un matmult vectorisé. Passez dans toutes les rangées et cols en un seul coup. C'est extrêmement rapide. Il n'y a pas de boucle en python ici. Je l'ai initialement conçu pour convertir de nombreuses colonnes binaires comme 0/1 pour 10 colonnes de genre différentes dans MovieLens en un seul entier pour chaque ligne d'exemple.

def BitsToIntAFast(bits):
  m,n = bits.shape
  a = 2**np.arange(n)[::-1]  # -1 reverses array of powers of 2 of same length as bits
  return bits @ a
Geoffrey Anderson
la source