将base-2二进制数字符串转换为int

Naf*_*Kay 269 python

我只想将base-2二进制数字串转换为int,如下所示:

>>> '11111111'.fromBinaryToInt()
255
Run Code Online (Sandbox Code Playgroud)

有没有办法在Python中执行此操作?

unw*_*ind 502

您使用内置int函数,并将其传递给输入数字的基数,即2二进制数:

>>> int('11111111', 2)
255
Run Code Online (Sandbox Code Playgroud)

这是python2python3的文档.

  • 如果有人正在寻找相反的东西:`bin(255)` - >`'0b11111111'.有关其他详细信息,请参阅[此答案](http://stackoverflow.com/a/699892/638546). (55认同)
  • 应该注意,这仅适用于无符号二进制整数.对于有符号整数,转换选项很乱. (7认同)
  • 如何在python 3中做到这一点? (3认同)
  • @SarasArya它非常相似!:)我更新了,见上文. (2认同)

len*_*ehx 32

只需在python交互界面中键入0b11111111:

>>> 0b11111111
    255
Run Code Online (Sandbox Code Playgroud)


Ale*_*lds 26

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

>>> from bitstring import BitArray
>>> b = BitArray(bin='11111111')
>>> b.uint
255
Run Code Online (Sandbox Code Playgroud)

请注意,无符号整数与有符号整数不同:

>>> b.int
-1
Run Code Online (Sandbox Code Playgroud)

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


Sau*_*ani 7

使用int with base是正确的方法.在我发现int也使用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))])
Run Code Online (Sandbox Code Playgroud)

  • 而不是定义`add = lambda x,y:x + y`,可以提供`int .__ add__`来减少.例如`reduce(int .__ add _,...)` (4认同)

Moh*_*oub 5

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

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')
Run Code Online (Sandbox Code Playgroud)


Geo*_*son 5

对于大型矩阵(10**5 行及以上),最好使用矢量化 matmult。一次传递所有行和列。它非常快。这里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
Run Code Online (Sandbox Code Playgroud)