int count_one(int x)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if ((x>>i) & 1)//&是按位与,&&是逻辑与
count++;
}
return count;
}
int main(void)
{
int a = 0;
scanf("%d", &a);
int count = count_one(a);
printf("%d", count);
return 0;
}
第二种写法:
这里巧妙的考虑了负数的情况。
#include<stdio.h>
int count_one2(unsigned int n)//unsigned int 是点睛之笔,考虑了负数的情况
{
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n /= 2;
}
return count;
}
int main(void)
{
int a = 0;
scanf("%d", &a);
int count = count_one2(a);
printf("%d", count);
return 0;
}
第三种写法:
十分重要且十分经典的写法,大公司面试的时候很看重的思想
!!!
int count—three(int a)
{
//计算a中出现1的个数(经典算法)
//a 1100
//a-1 1011
//a 1000
//a-1 0111
//a 0000
int i = 0;
while (a)
{
i++;
a = a&(a - 1);//a和a-1相与完再赋值给a
}
printf("%d", i);
return 0;
}