如果要计算一个整数的二进制数中共有几个1,最容易想到的方法就是下面这个方法:
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("二进制中1的个数 = %d\n", count);
但是,如果要计算一个负数呢?这个方法是行不通的。例如负数-1,-1除以2得到的余数并不是1 ,所以得到的结果就是0,但他的二进制数其实是有一个1的,这就产生了错误。
下面这个代码就比较好,既可以计算正整数的二进制数中1的个数,也可以计算负数的二进制数中1的个数。
用到了右移操作符,需要注意的是一定要循环32次,因为变量num是一个整型变量,占四个字节,32位。
每右移一位,最左边会补0,再与1进行按位与操作后就是0,而最右边的位就是我们要判断是不是1的那一位:
如果是1,与1按位与操作后还是1,count就加1;
如果不是1,按位与操作后,就变成0,与1按位与操作后是0,count不会变化。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = -1;
int count = 0;//计数
int i = 0;
for (i = 0; i < 32; i++)
{
if (((num >> i) & 1) == 1)
count++;
}
printf("二进制中1的个数 = %d\n", count);
system("pause");
return 0;
}