编写代码实现:求一个整数存储在内存中的二进制中1的个数
目的:统计num的补码中有几个1
法一
#include<stdio.h>
int main()
{
int num=0;
int count=0;
scanf("%d",&num);//3--011
//二进制:模2除2
while(num)//因为二进制只有0和1,当num不等于0的时候我们就对它的二进制位是否有1进行计数 0不需要我们计数就不进入循环
{
if(num%2==1)
count++;
num=num/2;
}
printf("%d\n",count);//2
return 0;
}

但是这种算法对负数的无法解决
优化
法二
从bit为进行思考 按位与
3 :00000000000000000000000000000011
1 :00000000000000000000000000000001
1&3:00000000000000000000000000000001
发现:当一个数和1与了之后 如果得到的这个数等于1则可以计算得到一个二进制数的1 如果右移则会进入下一个循环的开始
#include<stdio.h>
int main()
{
int num=0;
int count=0;
int i=0;
scanf("%d",&num);
for(i=0;i<32;i++)
{
if(1==((num>>i)&1))
count++;
}
printf("%d",count);
return 0;
}

法三
#include<stdio.h>
int main()
{
int num=-1;
int i=0;
int count=0;
while(num)
{
count++;
num=num&(num-1);
}
printf("%d",count);
return 0;
}