一、题目描述:
请实现一个函数,输入一个整数,输出该数二进制中表示1的个数,例如,把9表示成二进制1001,有2位是1。因此,如果输入9,则该函数输出2。
二、题目分析:
二进制数最后一位是1,减一之后,最后一位由1变为0,其他数位保持不变
二进制数最后一位是0,假设最右边的一位于第m位,减1之后,
第m位由1变0,第m位之后所有0变1,第m位之前数位不变
三、实现分析:
把一个整数减去1,就是把最右边的1变为0,如果它的右边还有0,则右边所有的0变为1,左边保持不变
把一个整数和它减去1 的结果做位于运算,相当于把最右边的1变为0
则操作的次数即二进制中1的个数
四、代码实现
#include<stdio.h>
#include<stdlib.h>
int NumberOf1(int n)
{
int count=0;
while(n)
{
//计数器计数 循环的次数即有1的个数
++count;
//把一个整数减去1,再和原整数做与运算,可将整数最右边的1变为0;
n=(n-1)&n;
}
return count;
}
int main()
{
printf("%d\n",NumberOf1(20)); //0001 0100 2
printf("%d\n",NumberOf1(12)); //0000 1100 2
printf("%d\n",NumberOf1(8)); //0000 1000 1
return 0;
}