Преобразовать строку двоичных чисел 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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.