整数二进制中1的个数

题目

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路

方法一

  1. 如果是0,返回0
  2. 如果是正整数,除二取余法
  3. 如果是负数:
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值