题目一:求一个整数的二进制序列中1的个数
分析:首先,我们知道数在内存中是以补码得形式储存的,而正数的原码补码反码都相同。
做法一:
int main()
{
int count = 0;
int num = 0;
printf("输入一个数:");
scanf("%d", &num);
while (num)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
printf("1的个数为%d", count);
system("pause");
return 0;
}
//可以测试正数,负数无法测试
先来看结果:
如果输入一个负数呢?
显然结果是错误的,所以这种做法是有缺陷的对于负数无法测试。
给出第二种思路:使用右移操作符将每一位都移到最右边在与1按位与,结果为1说明原位为1;结果为0说明原位为0;
int main()
{
int i = 0;
int num = 0, count = 0;
printf("请输入一个数:");
scanf("%d", &num);
for (i = 0; i < 32; i++)
{
if ((num >> i) & 1 == 1)
{
count++;
}
}
printf