c语言-求一个整数在内存中存储的二进制数中1的个数

111 阅读2分钟

题意:求一个整数在内存中存储的二进制数中1的个数
举例-3 => 31

因为在c语言中int类型所占内存大小为 4字节
-3转换为二进制为:100000000 000000000 000000000 00000011
那么 1 的个数应该为 3 呀,为啥是 31?

因为整形数在内存中是以补码的形式存储的,所以-3在内存中存储的二进制数中1的个数为11111111 111111111 11111111 11111101311

git地址gitee.com/svai/c-demo…

思路

  1. 如何使用c语言代码计算其二进制中1的个数呢?
    • 首先要思考如何判断其某一位的数值为1,然后才能获取其1的个数是多少

解决

我们采用按位与的方式(只有都为1才为1,有一个为0则为0)进行判断,我们只需将所求整数的某一位与1进行按位与即可判断该位是否1

这里我采用了右移操作符的方式,完成了每次循环判断其二进制数最后一位是否为1,然后再进行相加

具体代码

#include<stdio.h>

int main()
{
	int num = -3;
	int sz = sizeof(num) * 8;  //退出循环的界限,通过sizeof操作符求num在内存中所占字节大小
                             //乘8是因为1byte=8bit,由此就可算出num在内存中二进制位数有多少
	int i = 0;
	int count = 0;
	for (i = 0; i < sz; i++)
	{       //&:按位与操作符(只有都为1才为1,有一个为0则为0),每次只判断其最后一位是否为1
		if (num & 1) 
		{
			count++;
		}
		num = num >> 1;//将num向右移一位,将本次的倒数第二位,变为下次循环的最后一位
	}
	printf("在内存中二进制数1的个数有 %d 个\n", count);
}