解法一:
十进制转二进制同时数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.