目的:统计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>标签:count,二进制,个数,int,num,内存,printf,main From: https://blog.51cto.com/u_15899086/6023590
int main()
{
int num=-1;
int i=0;
int count=0;
while(num)
{
count++;
num=num&(num-1);
}
printf("%d",count);
return 0;
}