【发布时间】:2016-08-14 03:39:04
【问题描述】:
英特尔的位操作指令集 2 (BMI2) 中的 parallel deposit instruction (PDEP) 文档描述了该指令的以下串行实现(类 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;
}
See also Intel's pdep insn ref manual entry.
这个算法是O(n),其中n是mask中设置的位数,显然最坏的情况是O(k),其中k是mask中的总位数。
是否有可能更有效的最坏情况算法?
是否有可能制作一个更快的版本,假设val 最多设置一个位,即等于0 或等于1<<r 对于r 从0 到63 的某个值?
【问题讨论】:
-
Henry Warren,“Hacker's Delight”,第 2 版,第 7-5 章给出了一个用于一般 32 位 deposit 操作的并行后缀算法,并声称它需要大约160 条指令(具体数量取决于处理器指令集的具体情况)。如果我正确理解您关于 1 位存款的特殊情况的第二个问题,归结为快速隔离
mask的第 r 位。 -
对于您的1比特存款的特殊情况,是否会提前知道
r,或者我们必须先通过检查val找到r,然后再隔离r-mask中的第 1 位? -
r 如果还不知道,可以很容易地找到它。假设它是已知的。
标签: algorithm assembly x86 bit-manipulation bmi