题目:求一个整数存储在内存中的二进制中1的个数
首先,我们要明白整数储存在电脑中是以二进制的补码来进行存储的
如 5 的存储型式为 0000 0000 0000 0000 0000 0000 0000 0101(因为是整型1个字节8位,所以总共32位,这里不过多讲解)
我们一开始写的代码可能和如下的代码有着相同的问题:
#include <stdio.h>
int main()
{
int i=0;
int count=0;
scanf("%d",&i);
while(i)
{
if(i%2==1)
count++;
i=i/2;
}
printf("%d\n",count);
return 0;
}
-1 的存储型式为 1111 1111 1111 1111 1111 1111 1111 1111
本来应该输出32。
可以计算正数的中补码的个数,但无法计算-1(负数)补码中1的三个数,这可能就是我们代码中遇到的问题。
此时我们可以通过逻辑操作符来对我们的代码进行改善。
逻辑操作符&:在整型间进行与操作的过程是通过