这道题我一开始能想到的就只有位运算+右移,最直观。二进制最后一位 对应于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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。