通过代码实现求一个整数存储在二进制中的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;
}
嘿嘿,模仿一下