1.未优化的方法(不能求负数的)
int count_one(int n)
{
int i = 0;
int count = 0;
for(i=0;i<32;i++)
{
if (1 == (n >> i & 1))
count++;
}
return count;
}
2.将参数int更改未unsigned int(将补码符号位按正常的二进制位处理)
int count_one(unsigned int a)
{
int count = 0;
while (a)
{
if (1 == a % 2)
count++;
a = a / 2;
}
return count;
}
3.每按位与一次就少个1,直至a为0,跳出循环
例如:a=3 0011
a-1=2 0010
按位与后 0010
每进行一次就少一个1
int count_one(int a)
{
int count = 0;
while (a)
{
a = a & (a - 1);
count++;
}
return count;
}
主函数
int main()
{
int a = 0;
int count = 0;
scanf("%d", &a);
count=count_one(a);
printf("count=%d\n", count);
return 0;
}