Преобразовать строку двоичных чисел base-2 в int

306

Я просто хотел бы преобразовать строку двоичных чисел base-2 в int, что-то вроде этого:

>>> '11111111'.fromBinaryToInt()
255

Есть ли способ сделать это в Python?

Нафтули Кей
источник
3
Хотя это на самом деле не имеет значения, двоичная строка обычно означает строку, содержащую фактические двоичные данные (байт содержит две шестнадцатеричные цифры, т. Е. «\ X00» является нулевым байтом).
trevorKirkby

Ответы:

563

Вы используете встроенную intфункцию и передаете ей базу входного числа, т.е. 2для двоичного числа:

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

Вот документация для python2 и для python3 .

размотать
источник
61
В случае, если кто-то ищет обратное: bin(255)-> '0b11111111'. Смотрите этот ответ для получения дополнительной информации.
Аксели Пален
7
Следует отметить, что это работает только для двоичных чисел без знака. Для целых чисел со знаком параметры преобразования - беспорядок.
Поддельное имя
2
Как это сделать в Python 3?
Сарас Арья
2
@SarasArya Это очень похоже! :) Я обновился, см. Выше.
расслабиться
1
И обратите внимание, что в интерактивном сеансе REPL (как предложено в >>>приглашении) вам вообще не нужно его использовать print. Гипотетический пример ОП не сделал. Так что это действительно должно быть идентично в Python 2 и 3.
Джон Y
37

Просто введите 0b11111111 в интерактивном интерфейсе Python:

>>> 0b11111111
    255
lengxuehx
источник
28

Еще один способ сделать это с помощью bitstringмодуля:

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

Обратите внимание, что целое число без знака отличается от целого числа со знаком:

>>> b.int
-1

bitstringМодуль не является обязательным требованием, но она имеет много производительным методов превращения ввода в и из битов в другие формы, а также манипулировать ими.

Алекс Рейнольдс
источник
8

Использование int с базой - верный путь. Я делал это до того, как обнаружил, что int принимает базу. В основном это редукция, применяемая к списковому пониманию примитивного способа преобразования двоичного числа в десятичное (например, 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
Вместо определения add = lambda x, y: x + y, int.__add__могут быть предоставлены, чтобы уменьшить. Напримерreduce(int.__add__, ...)
Иордания Jambazov
4

Если вы хотите знать, что происходит за кулисами, то вот, пожалуйста.

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

Рекурсивная реализация Python:

def int2bin(n):
    return int2bin(n >> 1) + [n & 1] if n > 1 else [1] 
Людовик Троттье
источник
1

Если вы используете python3.6 или новее, вы можете использовать f-строку для преобразования:

Двоичные в десятичные:

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

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

от бинарного до восьмеричного гекса и т. д.

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

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

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

Обратите внимание на 2 части информации, разделенных двоеточием.

Таким образом, вы можете преобразовать {двоичное, восьмеричное, шестнадцатеричное, десятичное} в {двоичное, восьмеричное, шестнадцатеричное, десятичное}, изменив правую часть двоеточия [:]

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

Попробуйте изменить левую сторону двоеточия, чтобы иметь восьмеричное / шестнадцатеричное / десятичное число.

Роберт Ранджан
источник
0

Для больших матриц (10 ** 5 строк и выше) лучше использовать векторизованный матмат. Пройдите все ряды и столбцы одним выстрелом. Это очень быстро. Здесь нет петли в Python. Первоначально я разработал его для преобразования многих двоичных столбцов, например 0/1, для 10 столбцов разных жанров в MovieLens в одно целое число для каждой строки примера.

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
Джеффри Андерсон
источник