lowbit原理

这里最后一位1是指从左往右最后一位,函数lowbit()返回的是包含该1与右边所有0。

int lowbit(int x) {
    return x & - x;
}

-x 在计算机内部是以补码方式运算的,即:
-x = ~ x + 1
假设一个二进制数为: 0010101…0010100000
~x 为: 1101010…1101011111
~x + 1 为: 1101010…1101100000
注意到+1操作使得最后一位1及其右边所有数字发生了变化,而左边不变。
此时在和原数字进行&运算,它和原数字在最后一位1左侧全部不同,右侧全部相同。

code

#include<bits/stdc++.h>

using namespace std;

inline int lowbit(int x)
{
    return x & (-x);
}

int main()
{
    int n;
    for (; cin >> n;) {
        int cnt = 0;
        for (; n; n -= lowbit(n))
            cnt++;
        cout << cnt << endl;
    }
}