【问题标题】:How to convert bitarray to an integer in python如何在python中将bitarray转换为整数
【发布时间】:2017-07-16 19:30:29
【问题描述】:

假设我使用以下代码在 python 中定义了一些位数组:

from bitarray import bitarray
d=bitarray('0'*30)
d[5]=1

如何将 d 转换为其整数表示? 此外,如何使用位数组执行诸如d&(d+1) 之类的操作?

【问题讨论】:

  • 它看起来像 Python 3.2+ 你可以说int.from_bytes(d.tobytes),但我没有办法检查这个。您可能不得不摆弄bitarray 的字节序。

标签: python bit-manipulation bitarray


【解决方案1】:

正如Ilan Schnell 指出的,在bitarray.util 模块中有一个ba2int() 方法。

>>> from bitarray import bitarray
>>> from bitarray.util import ba2int
>>> d = bitarray('0' * 30)
>>> d[5] = 1
>>> d
bitarray('000001000000000000000000000000')
>>> ba2int(d)
16777216

在同一个模块中,有一个 zeros() 方法将前三行更改为

>>> from bitarray import bitarray
>>> from bitarray.util import ba2int, zeros
>>> d = zeros(30)

【讨论】:

    【解决方案2】:

    Bitarray 1.2.0 添加了一个实用模块bitarray.util,其中包括将位数组转换为整数的函数,反之亦然。这些函数称为int2baba2int。请在此处查看详细信息: https://github.com/ilanschnell/bitarray

    【讨论】:

    • 有什么理由将它们定义为实用函数而不是 bitarray 对象上的方法,例如 tobytes()
    【解决方案3】:

    我通常使用的更简单的方法是

    d=bitarray('0'*30)
    d[5]=1
    print(int(d.to01(),2))
    

    在代码方面,这可能效率不高,因为它将位数组转换为字符串,然后再转换回 int,但是在较短的脚本中阅读起来可能会更简洁。

    【讨论】:

      【解决方案4】:

      要将bitarray 转换为整数形式,您可以使用struct 模块:

      代码:

      from bitarray import bitarray
      import struct
      
      d = bitarray('0' * 30, endian='little')
      
      d[5] = 1
      print(struct.unpack("<L", d)[0])
      
      d[6] = 1
      print(struct.unpack("<L", d)[0])
      

      输出:

      32
      96
      

      【讨论】:

        【解决方案5】:
        from bitarray import bitarray
        d=bitarray('0'*30)
        d[5]=1
        
        i = 0
        for bit in d:
            i = (i << 1) | bit
        
        print i
        

        输出:16777216。

        【讨论】:

        • 我最喜欢这个解决方案,因为它不处理字符串处理。此外,如果您可以从最高有效位开始逐位构建整数,那么您也不需要位数组。
        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 2011-07-14
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        相关资源
        最近更新 更多