题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路
方法一
- 如果是0,返回0
- 如果是正整数,除二取余法
- 如果是负数:
3.1 如果是 -2147483648(int表示最大绝对值的负数),其补码是1000 0000 0000 0000 0000 0000 0000 0000, 故返回 1
3.2 其他负数,则用 re = 2147483647(int表示最大的整数) + number + 1 的到数字和 number的补码除了符号位,其他相同,因此number数字1的个数 = re数字1的个数 + 1;
方法二
相对于方法1巧妙一些。n-1 就会将n机器码中的最后一位 1 变为零,然后与 n 做 位与& 操作,就减少一位n的1,然后依次类推,记录做位与& 的次数,即为 n机器码中 1 的个数;
如: 二进制 11 & 10 = 10; 10 & 01 =00,共做了两次位与,故有两个1.
示例输入、输出
测试数据1:-1
方法1测试 1 的个数为: 32
方法2测试 1 的个数为: 32
------------------
测试数据2:1
方法1测试 1 的个数为: 1
方法2测试 1 的个数为: 1
------------------
测试数据3:2147483647
方法1测试 1 的个数为: 31
方法2测试 1 的个数为: 31
------------------
测试数据4:-2147483648
方法1测试 1 的个数为: 1
方法2测试 1 的个数为: 1
代码
#include <iostream>
using namespace std;
class Solution{
public:
// 方法1
int NumberOf1(int n){
if(n>0){
return PositiveNumber(n);
}
if(n<0) {
if (n == -2147483648) {
return 1;
}
else{
n = 2147483647 + n + 1;
return PositiveNumber(n)+1;
}
}
return 0;
}
// 方法2
int method2NumberOf1(int n){
int re(0);
if( n != 0){
while ( n != 0){
re++;
n = n & (n-1);
}
return re;
}
return 0;
}
private:
int PositiveNumber ( int number){
int re(0);
while (number > 0){
if(number%2 == 1)
re++;
number /= 2;
}
return re;
}
};
int main(){
// int test(2147483647);
// cout << test + 1 << endl << test + 1 - 5 << endl << test - 5 + 1 << endl;
int test1(-1),test2(1),test3(2147483647),test4(-2147483648),test(0); // 测试数据都在int范围内
Solution re;
cout << "测试数据1:" << test1 << endl
<< "方法1测试 " << "1 的个数为: " << re.NumberOf1(test1) << endl <<
"方法2测试 " << "1 的个数为: " << re.method2NumberOf1(test1) << endl <<
"------------------" << endl;
cout << "测试数据2:" << test2 << endl
<< "方法1测试 " << "1 的个数为: " << re.NumberOf1(test2) << endl <<
"方法2测试 " << "1 的个数为: " << re.method2NumberOf1(test2) << endl <<
"------------------" << endl;
cout << "测试数据3:" << test3 << endl
<< "方法1测试 " << "1 的个数为: " << re.NumberOf1(test3) << endl <<
"方法2测试 " << "1 的个数为: " << re.method2NumberOf1(test3) << endl <<
"------------------" << endl;
cout << "测试数据4:" << test4 << endl
<< "方法1测试 " << "1 的个数为: " << re.NumberOf1(test4) << endl <<
"方法2测试 " << "1 的个数为: " << re.method2NumberOf1(test4) << endl <<
endl;
return 0;
}