我想在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)
在简单性和性能方面,这可以做得更好吗?
答案 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%的时间显式循环更具可读性。