C语言_通过代码实现求一个整数存储在二进制中的1 的个数(极其详细版)

通过代码实现求一个整数存储在二进制中的1 的个数

首先要了解整数储存在二进制中是以补码的形式存在的。

然后移位运算符(>>)(<<)也是移动的二进制中的补码。

所以这个代码的目的就是求整数补码的二进制中的1的个数

 接下来要想的就是
         00000000 00000000 000000000 00000000
 一连串的二进制数,怎么判断它是不是1,这个时候可以用位运算符 按位与(&)
 来进行判断,按位与就是两个整数的补码对应二进制位都为1,才会返回1,其余都
 返回0。
解题思路

将需要运算的整数和1 按位与

    1是正数,原码,反码,补码相同,
    00000000 00000000 00000000 00000001

按位与只有对应的二进制位上都为1 才会返回1,其余都返回0,这个时候就可以判断目标整数的二进制最后一位是不是1。
如果是1

    1    00000000 00000000 00000000 00000001
    3    00000000 00000000 00000000 00000011
    按位与
         00000000 00000000 00000000 00000001
         返回1

同理,最后一位是0

    1    00000000 00000000 00000000 00000001
    2    00000000 00000000 00000000 00000010
    按位与
         00000000 00000000 00000000 00000000
         返回0

所以判断完最后一位后,接着去判断倒数第二位,怎么把倒数第二位变成最后一位,就是用移位运算符(>>)右移,接着创建一个变量count,用循环挨个判断,整数都是4个字节32位的,所以判断32次就够了,每次为1时,都把count++。

代码如下

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>


//编写代码实现,求一个整数储存在内存中二进制中的1的个数(就是补码中1 的个数)
int sum(i)
{
	int count = 0;//定义一个count 存放为1的次数
	int x = 0;
	for (x = 0; x <= 31; x++)//for循环32次
	{
		if ((i >> x & 1) == 1)//判断最后一位是不是1。    如果是1,进入if,count++。
		{
			count++;
		}
	}
	return count;
}

int main()
{
	int i = -1;
	int j = 0;
	j = sum(i);//调用一个sum函数计算
	printf("%d", j);

	return 0;
}

嘿嘿,模仿一下

完结撒花

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值