二进制位中1个数计算方法

发布时间 2023-11-11 23:11:15作者: bhxyry

二进制位中\(1\)个数计算方法

按位循环

while (y)
{
    if (y & 1)
        res++;
    y >>= 1;
}

Brian Kernighan 的位计数算法

while (y)
{
   ++res;
   y = (y & (y - 1));
}
  1. y - 1:将 y 减去1。这将导致 y 最右边的非零位变为0,而在这个非零位之后的所有位都会取反。
  2. y & (y - 1):通过进行位与操作,将 y 中的最右边的非零位及其之后的所有位都置零。

这个操作的结果是每次循环迭代,都会消除 y 中的一个非零位,直到 y 变为0。在每次循环迭代中,res 会递增,因此 res 最终将包含 y 中非零位的总数。

这种方法的优点在于,它可以在 y 中有多少个非零位就进行多少次循环,而不是对整个 y 进行逐位的检查。这使得算法的时间复杂度与 y 中非零位的数量成正比,而不是与 y 的总位数成正比,从而提高了效率。

__builtin_popcount()

__builtin_popcount(y)