我只是想把一个以2为基数的二进制数字字符串转换成一个int型,就像这样:
>>> '11111111'.fromBinaryToInt()
255
在Python中有办法做到这一点吗?
我只是想把一个以2为基数的二进制数字字符串转换成一个int型,就像这样:
>>> '11111111'.fromBinaryToInt()
255
在Python中有办法做到这一点吗?
当前回答
使用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))])
其他回答
使用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))])
另一种方法是使用bitstring模块:
>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255
注意无符号整数不同于有符号整数:
>>> b.int
-1
bitstring模块不是必需的,但它有许多性能方法,用于将输入转换为比特或将比特转换为其他形式,以及操作它们。
使用内置的int()函数,并将输入数的基数传递给它,即二进制数为2:
>>> int('11111111', 2)
255
这里是Python 2和Python 3的文档。
递归Python实现:
def int2bin(n):
return int2bin(n >> 1) + [n & 1] if n > 1 else [1]
对于大型矩阵(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