Converti stringa numero binario di base 2 in int


306

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?


3
Anche se non ha importanza, una stringa binaria in genere significa una stringa contenente dati binari effettivi (un byte contiene due cifre esadecimali, ovvero "\ x00" è un byte null).
trevorKirkby,

Risposte:


563

Si utilizza la intfunzione integrata e le si passa alla base del numero di input, ovvero 2per un numero binario:

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

Ecco la documentazione per python2 e per python3 .


61
Nel caso in cui qualcuno stia cercando il contrario: bin(255)-> '0b11111111'. Vedi questa risposta per ulteriori dettagli.
Akseli Palén,

7
Va notato che questo funziona solo per numeri interi binari senza segno. Per numeri interi con segno, le opzioni di conversione sono un casino.
Nome falso

2
Come fare questo in Python 3?
Saras Arya,

2
@SarasArya È molto simile! :) Ho aggiornato, vedi sopra.
Rilassati il

1
E si noti che in una sessione REPL interattiva (come suggerito dal >>>prompt), non è necessario utilizzare printaffatto. L'ipotetico esempio del PO no. Quindi dovrebbe essere identico in Python 2 e 3.
John Y,

37

Basta digitare 0b11111111 nell'interfaccia interattiva di Python:

>>> 0b11111111
    255

28

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.


8

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))])

4
Invece di definire add = lambda x, y: x + y, int.__add__può essere fornito per ridurre. Ad esempioreduce(int.__add__, ...)
Jordan Jambazov,

4

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')

3

Un'implementazione ricorsiva di Python:

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

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.


0

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.