这道题我一开始能想到的就只有位运算+右移,最直观。二进制最后一位 对应于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;
}