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?
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?
Respuestas:
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
bin(255)-> '0b11111111'. Vea esta respuesta para detalles adicionales.
>>>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.
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.
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))])
add = lambda x, y: x + y, int.__add__se puede proporcionar para reducir. Por ejemploreduce(int.__add__, ...)
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')
Una implementación recursiva de Python:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [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.
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