Я работаю с Bitmasks
в python
.Насколько я знаю, это массивы целых чисел, которые при распаковке в двоичный формат сообщают вам, какой из 32 битов установлен (= 1) для данного элемента в массиве.
Я хотел бы знать самый быстрый способ проверить, установлены ли 4 конкретных бита для какого-либо элемента массива.Я не забочусь об остальном.Я пробовал следующее решение, но оно недостаточно быстро для моей цели:
def detect(bitmask, check=(18,22,23,24), bits=32):
boolmask = np.zeros(len(bitmask), dtype=bool)
for i, val in enumerate(bitmask):
bithost = np.zeros(bits, dtype='i1')
masklist = list(bin(val)[2:])
bithost[:len(masklist)] = np.flip(masklist,axis=0)
if len(np.intersect1d(np.nonzero(bithost)[0] ,check)) != 0:
boolmask[i] = True
else:
boolmask[i] = False
if any(boolmask):
print("There are some problems")
else:
print("It is clean")
Например, если данный bitmask
содержит целое число 24453656 (1011101010010001000011000 in binary)
, вывод функции обнаружить будет «Есть некоторые проблемы», поскольку установлен бит 22:
bit: ... 20, 21, 22, 23, 24,...
mask: ... 0, 0, 1, 0, 0,...
Есть какие-нибудь идеи о том, как улучшить производительность?