仅使用标准库操作字节缓冲区中的位域

时间:2016-05-25 09:31:36

标签: python python-3.x

我想在DWORD中设置特定的位域,其中DWORD是在字节缓冲区偏移处获取的4个字节。我想只使用Python3标准库中提供的函数。我想出了下面的这段代码(示例是针对DWORD中的4个位域的情况):

field1 = set_bitfield(31, 29, 0x07)  # bit field 31:29 = 0x07
field2 = set_bitfield(28, 23, 0x2E)  # bit field 28:23 = 0x2E
field3 = set_bitfield(22, 16, 0x0E)  # bit field 22:16 = 0x0E
field4 = set_bitfield(15, 0, 0x08)      # bit field 15:0  = 0x08
struct.pack_into("<L", buffer, offset, field1|field2|field3|field4)

我还定义了普通的set_bitfield()函数:

def set_bitfield(bit_high, bit_low, value):
    return (value << bit_low) & ((1 << (bit_high + 1)) - 1)

在简单性和性能方面,这可以做得更好吗?

1 个答案:

答案 0 :(得分:0)

第一个例子

import itertools

bit_fields = [(31, 29, 0x07), (28, 23, 0x2E), (22, 16, 0x0E), (15, 0, 0x08)]
z = 0
for i in itertools.starmap(set_bitfield, bit_fields):
    z |= i

第二个

import itertools
import operator
import functools

x = functools.reduce(operator.or_,
                     itertools.starmap(set_bitfield, bit_fields))

但根据builtins

不可取
  

删除了reduce()。如果你确实需要,请使用functools.reduce();但是,99%的时间显式循环更具可读性。