用位运算求给定整数的二进制表示中1的个数
考虑到n-1会把n的二进制表示中最低位的1置0并把其后的所有0置1,同时不改变此位置前的所有位,那么n&(n-1)即可消除这个最低位的1。这样便有了比顺序枚举所有位更快的算法:循环消除最低位的1,循环次数即所求1的个数。此算法的时间复杂度为O(n的二进制表示中的1的个数),最坏情况下的复杂度O(n的二进制表示的总位数)。
//计算n的二进制表示中1的个数
int count1(unsignedint n)
{
intr = 0;
while(n)
{
n &= n-1; //每运算一次消去最后一个1
r++;
}
returnr;
}
ont-size:9.0pt'>