美文网首页
二进制中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