简单粗暴的方法:
和1取与,计数然后移位。
int OnesNumber(unsigned int n)
{
int count = 0;
while(n!=0)
{
if(n&1==1)//末尾是否为1
count++;
n=n>>1;//移位
}
return count;
}
快速法:
思想:n相当于在n-1的最低位加上1.n&(n-1)相当于清除了n的最低位的1.
8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000)
7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110)
int onesNumber(int n)
{
int count=0;
for(;n;count++)
{
n=n&(n-1);
}
return count;
}
不断清除n最右边1,同时累加计数直到n=0.