【问题标题】:Searching a more elegant way for converting a byte to a list of bits寻找一种更优雅的方式将字节转换为位列表
【发布时间】:2016-05-11 01:41:12
【问题描述】:

我目前正在使用这个小函数将字节转换为整数位列表,因为我需要遍历字节的单个位。

def byteToBitList(byte):
    return [int(bit) for bit in "{0:08b}".format(byte)]

但我不认为它很优雅。有一个更好的方法吗?可能不使用字符串?

【问题讨论】:

    标签: python list function byte bit


    【解决方案1】:

    您始终可以从使用bitwise operations 中受益,它适用于标准整数对象。只需将您的数字一次移动一位并收集最右边的位值。例如:

    >>> byte = 0xFC
    >>> list_size = 8
    >>> [(byte >> i) & 1 for i in range(list_size)][::-1] # reverse this array, since left-most bits are evaluated first.
    [1, 1, 1, 1, 1, 1, 0, 0]
    

    使用 IPython 计时:1000000 loops, best of 3: 1.54 µs per loop

    甚至可以在不反转数组的情况下生成此列表:

    >>> byte = 0xFC
    >>> list_size = 8
    >>> [(byte & (1 << (list_size - 1 - k))) >> (list_size - 1 - k) for k in range(list_size)]
    [1, 1, 1, 1, 1, 1, 0, 0]
    

    使用 IPython 计时:100000 loops, best of 3: 2.3 µs per loop。显然,倒排列表比使用两班倒更快!

    另外,this Stack Overflow thread 包含一个非常相似的问题。

    【讨论】:

      【解决方案2】:

      如果要避免字符串运算,可以使用二元运算,即移位&lt;&lt;&gt;&gt;结合逻辑和&amp;

      >>> def byteToBitList(byte):
          return [(byte & (1 << k)) >> k for k in range(8)]
      
      >>> byteToBitList(0xfc)
      [0, 0, 1, 1, 1, 1, 1, 1]
      

      【讨论】:

      • 请注意,您的输出是相反的:0xFC0b11111100。我已经写了这个问题的答案,展示了如何以正确的顺序获取位列表。
      【解决方案3】:

      您可以使用以下更快的解决方案:

      byte = 0xfc
      
      In [206]: list(map(int, bin(byte)[2:].zfill(8)))
      Out[206]: [1, 1, 1, 1, 1, 1, 0, 0]
      

      时机

      In [209]: %timeit byteToBitList(byte)
      100000 loops, best of 3: 5.69 us per loop
      
      In [211]: %timeit list(map(int, bin(byte)[2:].zfill(8)))
      100000 loops, best of 3: 4.27 us per loop
      

      【讨论】:

        【解决方案4】:

        您可以结合bin()str.zfill() 进行一些修剪,将整数转换为二进制表示:

        def byteToBitList(byte):
            return [int(bit) for bit in bin(byte)[2:].zfill(8)]
        

        这假设byte 确实是一个值0-255 的无符号整数。任何更大的结果列表将超过 8 位,尽管结果是正确的,只是没有填充零。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-21
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-28
          相关资源
          最近更新 更多