题意:求一个整数在内存中存储的二进制数中1的个数
举例:-3 => 31
因为在c语言中int类型所占内存大小为 4字节
-3转换为二进制为:100000000 000000000 000000000 00000011
那么 1 的个数应该为 3 呀,为啥是 31?
因为整形数在内存中是以补码的形式存储
的,所以-3
在内存中存储的二进制数中1的个数为11111111 111111111 11111111 11111101
共31
个1。
git代码地址:https://gitee.com/svai/c-demo.git
思路
- 如何使用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);
}