求二进制数中1的个数 分类: 编程之美 2015-04-24 19:25 17人阅读 评论(0) 收藏

这道题我一开始能想到的就只有位运算+右移,最直观。二进制最后一位 对应于mod2,右移一位对应于/2

int count(int v) {
    int num = 0;
    while(v) {
        if(v % 2 == 1) {
            num++;
        }
        v /= 2;
    }
    return num;
}

int count(int v) {
    int num = 0;
    while(v) {
        num += v & 0x01;
        v >>= 1;
    }
    return num;
}

现在来了个神奇的解法,使得我们不用整个遍历,这个算法本质上是二进制的减法。其实想想,我们十进制的时候算一个数字有多少,不就是-1再-1直到0么。

int count(int v) {
    int num = 0;
    while(v) {
        v &= (v-1);
        num++;
    }
    return num;
}

我们再考虑一下扩展的另一道题:给定两个正整数A和B,问把A变成B需要改变多少位?

int count(int a,int b) {
    int num = 0;
    int v;
    v = a & b;
    while(v) {
        v &= (v-1);
        num++;
    }
    return num;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/learnordie/p/4656928.html