这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。其原理是不断清除n的二进制表示中最右边的1或者最左边的1,同时累加计数器,直至n为0
如7(0111)
通过与 7-1 (0110)与操作消去最最左边的1,并累加计数器
7(0111)& 7-1 (0110) = 6 (0110)
再将 6 (0110) 与 6-1(0101)与操作消去最右边的1,并累加计数器
6(0110)& 5(0101) = 4(0100)
直至结果为0
算法实现如下
int BitCount2(unsigned int n)
{
unsigned int c = 0 ;
for (c = 0; n; ++c)
{
n &= (n - 1) ; // 清除最低位的1
}
return c ;
}