Vorrei semplicemente convertire una stringa di numero binario base-2 in un int, qualcosa del genere:
>>> '11111111'.fromBinaryToInt()
255
C'è un modo per farlo in Python?
Vorrei semplicemente convertire una stringa di numero binario base-2 in un int, qualcosa del genere:
>>> '11111111'.fromBinaryToInt()
255
C'è un modo per farlo in Python?
Risposte:
Si utilizza la intfunzione integrata e le si passa alla base del numero di input, ovvero 2per un numero binario:
>>> int('11111111', 2)
255
bin(255)-> '0b11111111'. Vedi questa risposta per ulteriori dettagli.
>>>prompt), non è necessario utilizzare printaffatto. L'ipotetico esempio del PO no. Quindi dovrebbe essere identico in Python 2 e 3.
Un altro modo per farlo è usare il bitstringmodulo:
>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255
Si noti che l'intero senza segno è diverso dall'intero con segno:
>>> b.int
-1
Il bitstringmodulo non è un requisito, ma ha molti metodi performanti per trasformare input in e da bit in altre forme, oltre a manipolarli.
Usare int con base è la strada giusta da percorrere. Lo facevo prima di scoprire che anche int prende base. Fondamentalmente si tratta di una riduzione applicata su una lista di comprensione del modo primitivo di convertire i binari in decimali (es. 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__può essere fornito per ridurre. Ad esempioreduce(int.__add__, ...)
Se vuoi sapere cosa sta succedendo dietro la scena, allora eccoti qui.
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')
Un'implementazione ricorsiva di Python:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [1]
Se stai usando python3.6 o successivo puoi usare f-string per fare la conversione:
Da binario a decimale:
>>> print(f'{0b1011010:#0}')
90
>>> bin_2_decimal = int(f'{0b1011010:#0}')
>>> bin_2_decimal
90
binario in hexa ottale ed ecc.
>>> f'{0b1011010:#o}'
'0o132' # octal
>>> f'{0b1011010:#x}'
'0x5a' # hexadecimal
>>> f'{0b1011010:#0}'
'90' # decimal
Presta attenzione a 2 informazioni separate da due punti.
In questo modo, puoi convertire tra {binario, ottale, esadecimale, decimale} in {binario, ottale, esadecimale, decimale} cambiando il lato destro dei due punti [:]
:#b -> converts to binary
:#o -> converts to octal
:#x -> converts to hexadecimal
:#0 -> converts to decimal as above example
Prova a cambiare il lato sinistro dei due punti per avere ottale / esadecimale / decimale.
Per una matrice di grandi dimensioni (10 ** 5 righe e oltre) è meglio usare un matmult vettoriale. Passa tutte le file e i col in un colpo solo. È estremamente veloce. Non c'è looping in Python qui. Inizialmente l'ho progettato per convertire molte colonne binarie come 0/1 per circa 10 colonne di genere diverso in MovieLens in un unico numero intero per ogni riga di esempio.
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