Я хочу упаковать биты на основе произвольной маски

Допустим, что данные1011 1001 и маска0111 0110тогда у вас есть:

data:             1011 1001
mask:             0111 0110
masked data:      0011 0000 
bits selected:    -011 -00-
right packed:     ---0 1100
result:           0000 1100 (set left `8 - popcount(mask)` bits to zero) 

Итоговый результат0000 1100 (обратите внимание, что 3 позиции слева, которые не указаны, заполнены нулями).

Вы можете видеть, что где бит маски равен 1, соответствующее значение вdata являетсявыбранный (вbits selected выше) а потом всевыбранный биты упаковываются непрерывно, начиная с младших значащих битов результата (как показано вright packed выше). Наконец, любые крайние левые биты, оставшиеся после упаковки, устанавливаются в 0 (будет8 - popcount(mask) такие биты).

Очевидным выбором является поворот и выбор, но это потребует 5 операций, поскольку маска имеет 5 битов. Могу ли я сделать это за один шаг?

Замечания:

Маска может быть любой с произвольнойn битыON (В приведенном выше примереn=5). Все, что вы знаете, это количество бит, которыеON в маске и самой маске. Маска будет меняться сn битыON.

В приведенном выше примере я использовал данные и маску из 8 битов, но при реальном использовании они могут быть 8, 16, 32, 64 и 128 бит.

Ответы на вопрос(1)

Ваш ответ на вопрос