Я хочу упаковать биты на основе произвольной маски
Допустим, что данные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 бит.