转换以2为基数的二进制数字字符串为int

我只是想把一个以2为基数的二进制数字字符串转换成一个int型,就像这样:

>>> '11111111'.fromBinaryToInt()
255

在Python中有办法做到这一点吗?

620148 次浏览

使用内置的int()函数,并将输入数的基数传递给它,即2用于二进制数:

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

下面是Python 2Python 3的文档。

另一种方法是使用bitstring模块:

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

注意无符号整数不同于有符号整数:

>>> b.int
-1

bitstring模块不是必需的,但它有许多性能方法用于将输入转换为比特或将比特转换为其他形式,以及操作它们。

使用int和base是正确的方法。在我发现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))])

在python交互界面中输入0 b11111111即可:

>>> 0b11111111
255

如果你想知道幕后发生了什么,那就给你。

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来执行 转换:< / p >

二进制到十进制:

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

注意用冒号分隔的两条信息。

这样,通过更改冒号[:]右侧,可以在{二进制,八进制,十六进制,十进制}之间转换为{二进制,八进制,十六进制,十进制}

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

试着把冒号的左边改成八进制/十六进制/十进制。

对于大型矩阵(10**5行以上),最好使用向量化matmult。在一次射击中通过所有的排和cols。它非常快。这里python中没有循环。我最初设计它是为了将MovieLens中10个不同类型列的二进制列(如0/1)转换为单个整数。

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

为了记录在基本python3中来回执行:

a = 10
bin(a)
# '0b1010'


int(bin(a), 2)
# 10
eval(bin(a))
# 10

下面是另一种简洁的方法,上面的答案中没有提到:

>>> eval('0b' + '11111111')
255

不可否认,它可能不是很快,如果字符串来自您无法控制的东西,可能是恶意的(比如用户输入),这是一个非常非常糟糕的主意,但为了完整性,它确实有效。