Управление битовыми полями в байтовом буфере только со стандартной библиотекой

Я хочу установить определенные битовые поля в DWORDs, где DWORD-4 байта, взятые со смещением в байтовом буфере . Я хочу использовать только функции, доступные в стандартной библиотеке Python3. Я придумал этот кусок кода ниже (пример для случая 4 битовых полей в DWORD):

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 ответ

  1. Первый пример

    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 (). Используйте функции.уменьшите (), если это действительно нужно; однако в 99 процентах случаев явный цикл for более удобочитаем.