Я просто хотів би перетворити рядок двійкового числа бази-2 у int, приблизно так:
>>> '11111111'.fromBinaryToInt()
255
Чи є спосіб це зробити в Python?
Я просто хотів би перетворити рядок двійкового числа бази-2 у int, приблизно так:
>>> '11111111'.fromBinaryToInt()
255
Чи є спосіб це зробити в Python?
Відповіді:
Ви використовуєте вбудовану intфункцію і передаєте їй основу вхідного числа, тобто 2для двійкового числа:
>>> int('11111111', 2)
255
>>>підказці) вам взагалі не потрібно користуватися print. Гіпотетичний приклад ОП не став. Отже, це справді має бути ідентичним у Python 2 та 3.
Ще один спосіб зробити це за допомогою bitstringмодуля:
>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255
Зауважте, що непідписане ціле число відрізняється від підписаного цілого числа:
>>> b.int
-1
bitstringМодуль не є обов'язковою вимогою, але вона має багато продуктивним методів перетворення введення в і з бітів в інші форми, а також маніпулювати ними.
Використання 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))])
add = lambda x, y: x + y, int.__add__можна передбачити зменшення. Напр.reduce(int.__add__, ...)
Якщо ви хочете знати, що відбувається за сценою, тоді ви йдете.
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')
Рекурсивна реалізація Python:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [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
Спробуйте змінити ліву частину товстої кишки на вісімкову / шістнадцяткову / десяткову.
Для великої матриці (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