二进制位中\(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)
标签:二进制位,res,个数,零位,循环,计算方法
From: https://www.cnblogs.com/bhxyry/p/17826546.html