方法1(代码细节如下)
int count_twobit(unsigned int n)//功能函数
{
int count = 0;
while (n)
{
//很经典的用法 取什么进制的数就%上什么进制,取出来的就是最低位
if (n % 2 == 1)//如果最低位是1则count++
count++;
n = n / 2;//去除最低位
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int n = count_twobit(a);
printf("%d", n);
system("pause");
return 0;
}
这里要注意形参n必须转换为unsigned int ,不然只能计算正整数。
方法2(代码细节如下)
//知识说明: a&1 ==1 说明a的二进制最低位是1 a&1==0 则0
int main()
{
int n = 0;
int count = 0;
scanf("%d", &n);
for (int i = 0; i < 32; i++)
{
if (((n >> i)&1) == 1)//每循环一次就右移一位 总共32位
count++;//如果为1就++
}
printf("%d\n", count);
system("pause");
return 0;
}
思考还能不能更加优化,这⾥必须循环32次的。
方法3(奇招)
小知识://n = n&(n-1) 效果:把n的二进制中最右边的1去掉了
//n=15
1111 - n
1110 - n-1
1110 - n
具体代码如下
int main()//把n的二进制中最右边的1去掉
{
int a = 0;
int count = 0;
scanf("%d", &a);
while (a)//每循环一次就减少一个1
{
a = a&(a - 1);
count++;
}
printf("%d", count);
system("pause");
return 0;
}