计算二进制整数中的1 的个数

如果要计算一个整数的二进制数中共有几个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;
}

猜你喜欢

转载自blog.csdn.net/qq_41158320/article/details/84191968
今日推荐