普通 (暴力) 方法:先求int位数,然后循环记录1的个数
int NumberOf1(int n) {
int loopnum = 8 * sizeof(int), ans = 0;
while(loopnum--){
ans += n&0x1;
n = n>>1;
}
return ans;
}
优化版本:
记住一句话:将原码最低位的1的左侧全部求反即为补码。
于是就出现了下面的代码:
int NumberOf1(int n) {
for(unsigned int r = 0, m = n; ; ++r, m -= m & -m)
if(m == 0) return r;
}