Перетворити рядок двійкового числа base-2 в int


306

Я просто хотів би перетворити рядок двійкового числа бази-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.
John 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 with base - це правильний шлях. Раніше я робив це, перш ніж я виявив, що Інт також приймає базу. В основному це зменшення, застосоване в списку розуміння примітивного способу перетворення двійкового в десятковий (наприклад, 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__, ...)
Йордан Джамбазов

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-string для перетворення:

Двійкові до десяткових:

>>> 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.