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

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

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

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

git代码地址:https://gitee.com/svai/c-demo.git

思路

  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);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值