不要0!我们需要1!

解法一:
十进制转二进制同时数1的个数
#include<iostream>
#define endl '\n'
using namespace std;
void solve(int x) {int cnt = 0;while (x) {if (x % 2 == 1) cnt++;x /= 2;}cout << cnt << endl;
}
int main() {int n;cin >> n;solve(n);return 0;
}
解法二:
位运算
#include<iostream>
#define endl '\n'
using namespace std;
void solve(int x) {int cnt = 0;while (x) {cnt += x & 1;x >>= 1;}cout << cnt << endl;
}
int main() {int n;cin >> n;solve(n);return 0;
}
使用x&1来取得最低位的数,右移再循环取值,直至最高位的1
解法三:
同位运算
#include<iostream>
#define endl '\n'
using namespace std;
void solve(int x) {int cnt = 0;while (x) {x = x & (x - 1);cnt++;}cout << cnt << endl;
}
int main() {int n;cin >> n;solve(n);return 0;
}
对任意的x,二进制的表示是形如这样的数字:**...**100...00,从右往左是任意多的0,**表示1左边任意0或1,对x-1得到**...**011...11,x&(x-1)相当于消去了从右往左的第一个1,循环直至消去全部1.