Convierta la cadena de número binario base-2 a int

306

Simplemente me gustaría convertir una cadena de número binario base-2 en un int, algo como esto:

>>> '11111111'.fromBinaryToInt()
255

¿Hay alguna manera de hacer esto en Python?

Naftuli Kay
fuente
3
Si bien en realidad no importa, una cadena binaria generalmente significa una cadena que contiene datos binarios reales (un byte contiene dos dígitos hexadecimales, es decir, "\ x00" es un byte nulo).
trevorKirkby

Respuestas:

563

Utiliza la intfunción incorporada y pasa la base del número de entrada, es decir, 2para un número binario:

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

Aquí hay documentación para python2 y para python3 .

relajarse
fuente
61
En caso de que alguien busque lo contrario: bin(255)-> '0b11111111'. Vea esta respuesta para detalles adicionales.
Akseli Palén
77
Cabe señalar que esto solo funciona para enteros binarios sin signo. Para enteros con signo, las opciones de conversión son un desastre.
Nombre falso el
2
¿Cómo hacer esto en Python 3?
Saras Arya
2
@SarasArya ¡Es muy similar! :) He actualizado, ver arriba.
relajarse
1
Y tenga en cuenta que en una sesión interactiva REPL (como lo sugiere la >>>solicitud), no necesita usar printnada. El ejemplo hipotético del OP no lo hizo. Así que realmente debería ser idéntico en Python 2 y 3.
John Y
37

Simplemente escriba 0b11111111 en la interfaz interactiva de Python:

>>> 0b11111111
    255
lengxuehx
fuente
28

Otra forma de hacerlo es utilizando el bitstringmódulo:

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

Tenga en cuenta que el entero sin signo es diferente del entero con signo:

>>> b.int
-1

El bitstringmódulo no es un requisito, pero tiene muchos métodos eficaces para convertir la entrada en bits y desde otros en otras formas, así como para manipularlos.

Alex Reynolds
fuente
8

Usar int con base es el camino correcto. Solía ​​hacer esto antes de encontrar que int también toma base. Básicamente es una reducción aplicada en una comprensión de la lista de la forma primitiva de convertir binario a decimal (por ejemplo, 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
fuente
44
En lugar de definir add = lambda x, y: x + y, int.__add__se puede proporcionar para reducir. Por ejemploreduce(int.__add__, ...)
Jordan Jambazov
4

Si quieres saber qué está sucediendo detrás de escena, aquí tienes.

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
fuente
3

Una implementación recursiva de Python:

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

Si está utilizando python3.6 o posterior, puede usar f-string para realizar la conversión:

Binario a decimal:

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

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

binario a hexa octal y etc.

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

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

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

Presta atención a 2 datos separados por dos puntos.

De esta manera, puede convertir entre {binario, octal, hexadecimal, decimal} a {binario, octal, hexadecimal, decimal} cambiando el lado derecho del colon [:]

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

Intente cambiar el lado izquierdo del colon para tener octal / hexadecimal / decimal.

Robert Ranjan
fuente
0

Para una matriz grande (10 ** 5 filas y más) es mejor usar un matmult vectorizado. Pase en todas las filas y cols de una sola vez. Es extremadamente rapido. No hay bucles en Python aquí. Originalmente lo diseñé para convertir muchas columnas binarias como 0/1 para 10 columnas de género diferentes en MovieLens en un solo entero para cada fila de ejemplo.

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
fuente