加速位计数的探索
1. 计算两个字的位计数差值
在计算两个字的位计数差值时,可以通过如下公式进行推导:
[
\begin{align }
pop(x) - pop(y) &= pop(x) - (32 - pop(y))\
&= pop(x) + pop(y) - 32
\end{align }
]
然后使用特定技术计算 (pop(x) + pop(y)),以下是计算 (pop(x) - pop(y)) 的代码示例:
int popDiff(unsigned x, unsigned y) {
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
y = ~y;
y = y - ((y >> 1) & 0x55555555);
y = (y & 0x33333333) + ((y >> 2) & 0x33333333);
x = x + y;
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = x + (x >> 8);
x = x + (x >> 16);
return (x & 0x0000007F) - 32;
}
该代码使用 32
超级会员免费看
订阅专栏 解锁全文
1112

被折叠的 条评论
为什么被折叠?



