2016-04-03 5 views
0

Скажем, у меня есть ByteArray как следующее:
mask = bytearray([0b0001, 0b0100, 0b0111]),
, где каждый бит представляет собой определенный флаг. Я хотел бы добавить флаг срезы массива маски, как так:
mask[0:2] = mask[0:2] | 0b1000
, но я получаю TypeError:
TypeError: unsupported operand type(s) for |: 'bytearray' and 'int'
, что будет наиболее элегантным способом сделать это?операции Bitmask на срезах Python ByteArray,

Пробовал это, а также:
masks[0:2] = bytearray([bin(m | 0b0001) for m in masks[0:2]]) с ошибкой:
string must be of size 1

Спасибо!

ответ

2

Не может быть сделан непосредственно, не прибегая к numpy, но вы могли бы работать вокруг него:

mask[:2] = (b | 0b1000 for b in mask[:2]) 

print(list(map(bin, mask))) 

получает вас:

['0b1001', '0b1100', '0b111'] 

Вы были близки с последней попыткой, но обертывание bin преобразовывал в строковое представление, когда вы действительно хотели исходное целочисленное значение.

+0

Спасибо, я даже не думал о numpy. Я могу сделать что-то вроде: 'masks [0: 2] = np.bitwise_or (маски [0: 2], 0b0001)', а затем увидеть мои измененные флаги с помощью 'map (np.binary_repr, masks)' – user5283407