题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
输入例子:
5
输出例子:
2
解题思路
首先考虑一个问题,如何将一个十进制整数转化为一个二进制数呢?首先,int型整数在内存中占用4个字节,即32位。其中第一位是符号位,负整数的符号位为1,正整数的符号位为0。因此,我们不妨考虑正整数的情况,负整数可以转化为正整数进行处理。
对于一个正整数num,不停地对它除以2,直到商为0,得到的余数就构成相应的二进制数。因此,我们只需要记录这些余数中1的个数即可。
需要注意的是,最小负整数INT_MIN是无法转化为相应的正整数的,但是它对应的二进制数是已知的,即32位都是1。
代码
#include <iostream>
#include <climits>
using namespace std;
int main()
{
int num;
cin >> num;
int count = 0;
if (num == INT_MIN) //最小负数
count = 32;
else if (num < 0) //其它负数
{
num = -num; //化为正数处理
count = 1; //负数的符号位为1
}
while (num > 0)
{
if (num % 2)
count++;
num >>= 1;
}
cout << count << endl;
return 0;
}