编写代码实现:求一个整数存储中的二进制数中1的个数
方法1:
#include<stdio.h>
int main()
{
int num=0;
int count=0;
scanf("%d",&num);
while(num!=0)
{
if(num%2==1)
count++;
num=num/2;
}
printf("%d\n",count);
return 0;
}
原理:每一位先模2,就可以求出最低位是否为1,除2,把最低位给去除,然后不断循环,直至数字变为0
但这个不能用于负数。
方法2
#include<stdio.h>
int main()
{
int num=0;
int count=0;
scanf("%d",&num);
for(int i=0;i<32;i++)
{
if((num>>i)&1==1)
count++;
}
}
for循环32次,每次右移i位,然后移动后的值和1的32位2进制进行与运算,如果最后一位是1,那么和32位二进制1与的结果就是1,count自增1,循环32次即可判断最初的那个数的每一位。
方法3
int main()
{
int a=0;
scanf("%d",&a);
int count=0;
while(a)
{
a=a&(a-1);
count++;
}
printf("%d\n",count);
return 0;
}
举个例子:
15
1111
14
1110
两者与操作,会把最右边的那个1给消掉,把这个结果再赋回,
所以一个数和其减1的数进行与操作,结果再赋回,不断循环,循环的次数即是最开始二进制数中1的个数。