美文网首页
二进制中1的个数

二进制中1的个数

作者: EJ17zj | 来源:发表于2017-08-09 17:47 被阅读16次

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

这个题是一个很简单的题,利用位操作即可。但是鉴于很少有人用bitset类来解决问题,所以整理到此文中。

下面的方法1是基于bitset类求解的方案,直接实例化一个与int等大小的bitset变量,然后赋值,利用内置统计函数count返回结果。

关于bitset类,我之前的博文位变量中有较详细的介绍。

  • 方法1:bitset方法
    简单粗暴易懂。
class Solution {
public:
    int  NumberOf1(int n) {
        bitset<sizeof(n) * 8> bn;
        bn = n;
        return bn.count();
    }
};
  • 方法2:移位法
    一位一位移动并统计,容易理解,循环次数过多。
class Solution {
public:
    int  NumberOf1(int n) {
        int nB = sizeof(n);
        int mask = 0x01;
        int sum = 0;
        for (int i = 0; i < nB * 8; i++) {
            if (n&mask)
                sum++;
            n >>= 1;
        }
        return sum;
    }
};
  • 方法3:相与法(最优)
    最高效的法子,通过n = n&(n - 1)每次消除位为1的最低位,二进制中有多少个1就循环多少次;
    无论正数还是负数,在机器中进行n-1的效果是相同的。
class Solution {
public:
    int  NumberOf1(int n) {
        int sum = 0;
        while (n) {
            sum++;
            n = n&(n - 1);
        }       
        return sum;
    }
};

相关文章

网友评论

      本文标题:二进制中1的个数

      本文链接:https://www.haomeiwen.com/subject/nveqrxtx.html