2012-01-19 10 views
185

ja po prostu lubię konwersji liczby binarnej ciąg bazowy-2 do int, coś takiego:Konwersja base-2 binarna liczba ciąg do int

>>> '11111111'.fromBinaryToInt() 
255 

Czy istnieje sposób, aby zrobić to w Pythonie ?

+2

Choć to naprawdę nie ma znaczenia, ciąg binarny zazwyczaj oznacza łańcuch zawierający aktualne dane binarne (bajt zawiera dwie cyfry szesnastkowe, czyli „\ x00” jest zerowy bajt). –

Odpowiedz

315

użyć wbudowanego int funkcji i przekazać go podstawa numeru wejścia, tj 2 na liczbę binarną:

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

Oto dokumentacji python2, a dla python3.

+0

Dzięki, dokładnie to, czego szukałem. –

+27

Jeśli ktoś szuka czegoś przeciwnego: 'bin (255)' -> ''0b11111111''. Aby uzyskać dodatkowe informacje, patrz [ta odpowiedź] (http://stackoverflow.com/a/699892/638546). –

+5

Należy zauważyć, że działa to tylko dla liczb całkowitych bez znaku binarnego. W przypadku liczb całkowitych ze znakiem, opcje konwersji są bałaganem. –

21

Innym sposobem na to jest za pomocą modułu bitstring:

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

Należy zauważyć, że liczba całkowita bez znaku różni się od podpisanego integer:

>>> b.int 
-1 

Moduł bitstring nie jest wymogiem , ale ma wiele wydajnych metod przekształcania danych wejściowych do i z bitów w inne formy, a także manipulowania nimi.

4

Używanie int z bazą to właściwa droga. Zwykłem to robić, zanim znalazłem int również. Jest to w zasadzie zmniejszają stosowane na liście zrozumienia pierwotnego drodze konwersji pliku na dziesiętne (np 110 = 2 ** 0 * 0 + 1 * 2 ** 2 ** 1 + 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))]) 
+2

Zamiast definiować 'add = lambda x, y: x + y', można podać' int .__ add__' w celu zmniejszenia. Na przykład. 'reduce (int .__ add__, ...)' –

21

Wystarczy wpisać 0b11111111 w Pythonie interaktywny interfejs:

>>> 0b11111111 
    255 
1

Jeśli chcesz wiedzieć, co dzieje się za sceną, to tutaj jesteś.

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