二进制位中1个数计算方法
二进制位中\(1\)个数计算方法
按位循环
while (y)
{
if (y & 1)
res++;
y >>= 1;
}
Brian Kernighan 的位计数算法
while (y)
{
++res;
y = (y & (y - 1));
}
y - 1:将y减去1。这将导致y最右边的非零位变为0,而在这个非零位之后的所有位都会取反。y & (y - 1):通过进行位与操作,将y中的最右边的非零位及其之后的所有位都置零。
这个操作的结果是每次循环迭代,都会消除 y 中的一个非零位,直到 y 变为0。在每次循环迭代中,res 会递增,因此 res 最终将包含 y 中非零位的总数。
这种方法的优点在于,它可以在 y 中有多少个非零位就进行多少次循环,而不是对整个 y 进行逐位的检查。这使得算法的时间复杂度与 y 中非零位的数量成正比,而不是与 y 的总位数成正比,从而提高了效率。
__builtin_popcount()
__builtin_popcount(y)

浙公网安备 33010602011771号