编写代码实现:求一个整数存储在内存中的二进制中1的个数

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目的:统计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;
}

编写代码实现:求一个整数存储在内存中的二进制中1的个数_补码

但是这种算法对负数的无法解决

优化

法二

从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;
}

编写代码实现:求一个整数存储在内存中的二进制中1的个数_i++_02

法三

#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;
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6