Допустим, что данные 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 бит.
Что значит «перемещение вправо»? Каков результат, если маска равна 0111 0111? – janovak
Итак, другими примерами будут '1101 0010' с маской' 0001 1111' -> '0001 0010' и данными' 1101 0010' mask '1111 1000' ->' 0001 1010'? А так как маска имеет 5 '1' бит, высокие 3 бита результата всегда будут' 0'? – jaggedSpire
Было бы проще понять, что вы пытаетесь сделать, если бы вы включили существующий (5-операционный) код в качестве примера в свой вопрос. –