У меня есть набор из четырех битвекторов, например:
b1 = 00001010
b2 = 10100111
b3 = 10010010
b4 = 10111110
Я хотел бы получить маски тех битов, которые установлены точно в 0, 1, 2, 3 или 4 данных битвекторов. Таким образом, m0 будет маской битов, которые не установлены ни в одном из четырех битвекторов, m3 - это маска тех битов, которые установлены ровно в три из битвекторов и т.д.:
m0 = 01000000
m1 = 00000001
m2 = 00111100
m3 = 10000000
m4 = 00000010
Каков самый быстрый способ найти эти маски с помощью побитовых операторов?
Я предполагаю, что они имеют наименьшие операции для 0 и 4 бит:
m0 = ~(b1 | b2 | b3 | b4) // 4 ops
m4 = b1 & b2 & b3 & b4 // 3 ops
Для других параметров я не уверен, что мои методы имеют наименьшие операции:
m1 = ((b1 ^ b2) & ~(b3 | b4)) | (~(b1 | b2) & (b3 ^ b4)) // 9 operations
m2 = ((b1 ^ b2) & (b3 ^ b4)) | ((b1 ^ b3) & (b2 ^ b4)) | ((b1 ^ b4) & (b2 ^ b3)) // 11 operations
m3 = ((b1 ^ b2) & (b3 & b4)) | ((b1 & b2) & (b3 ^ b4)) // 7 operations
Является ли это самым быстрым способом вычисления этих масок или я могу сделать это быстрее (за меньшее количество операций)?
В большинстве случаев мне нужна одна или несколько из этих масок, но не все из них в одно и то же время.
(Обратите внимание, что в действительности я буду делать это для 64 или 128-битных векторов. Это, вероятно, не имеет значения, но я делаю это на C на 32-разрядной платформе x86.)