法一:
#include<stdio.h>
int count_one_bit(int n)
{
int count=0;
while(n)
{
if(n%2==1)
count++;
n/=2;//若n==-1,则n/2==0,n%2==-1,终止循环
}
return count;
}
int main()
{
int n;
scanf("%d",&n);
int count=count_one_bit(n);
printf("%d\n",count);
return 0;
}
注:负数是不能这种方法计算二进制中1的个数的
法一(改):
#include<stdio.h>
int count_one_bit(unsignedint n)//加上unsigned后,传过来的形参如果是负数
//则被认为是无符号整数
{
int count=0;
while(n)
{
if(n%2==1)
count++;
n/=2;
}
return count;
}
int main()
{
int n;
scanf("%d",&n);
int count=count_one_bit(n);
printf("%d\n",count);
return 0;
}
法二:
#include<stdio.h>
int count_one_bit(int n)
{
int count=0;
int i=0;
for(i=0;i<32;i++)
{
if((n>>i)&1==1)
count++;
}
return count;
}
int main()
{
int n;
scanf("%d",&n);
int count=count_one_bit(n);
printf("%d\n",count);
return 0;
}
法三:
n=n&(n-1)
只要执行1次,n的二进制最右边的1就会消失
#include<stdio.h>
int count_one_bit(int n)
{
int count=0;
while(n)
{
n=n&(n-1);
count++;
}
return count;
}
int main()
{
int n;
scanf("%d",&n);
int count=count_one_bit(n);
printf("%d\n",count);
return 0;
}