废话少说,看分析
例如: 二进制数10010010 = 10000000+10000+10
问题转换为求10000000、10000、10三个二进制数中1的个数,显然每个都为1个,总共就是三个
再看这三个二进制数的特征,显然每个都是2的幂,那么问题转换为如何求一个数是否为2的幂
求一个数是否为2的幂方法就简单多了, 直接给出 if(n&(n-1)){/不/是2的幂} else{是}。
总结:每次计算n&(n-1)可以消除一个1,问题转换为n&(n-1)的次数。
C代码
int Func(int n)
{
int m = n;
int count = 0;
while(m>=1)
{
m = m & (m-1);
count++;
}
return count;
}