Документация для инструкции по параллельному депонированию (PDEP
) в наборе инструкций Intel по управлению битами 2 ( BMI2) описывает следующую последовательную реализацию инструкции (C-подобный псевдокод):
U64 _pdep_u64(U64 val, U64 mask) {
U64 res = 0;
for (U64 bb = 1; mask; bb += bb) {
if (val & bb)
res |= mask & -mask;
mask &= mask - 1;
}
return res;
}
См. также pdep
insn ref, вводимые вручную в Intel.
Этот алгоритм - O (n), где n - количество установленных битов в mask
, что, очевидно, имеет наихудший случай O (k), где k - общее количество битов в mask
.
Возможен ли более эффективный алгоритм наихудшего случая?
Можно ли сделать более быструю версию, предполагающую, что val
имеет не более одного установленного бита, то есть либо равно 0, либо равно 1<<r
для некоторого значения r
от 0 до 63?
mask
. - person njuffa   schedule 14.08.2016r
будет известно заранее, или нам нужно сначала найтиr
, исследуяval
, прежде чем изолироватьr
-й 1-бит вmask
? - person njuffa   schedule 14.08.2016