方法一
位运算x & -x
可以求出最低位的1,可以通过不断减去x & -x
,每次操作都可以可以逐步减少 1 的个数,从而快速计算 1 的个数。。
#include <iostream>
using namespace std;
int get(int x) {
int ans = 0;
while(x) {
x -= x & -x;
ans++;
}
return ans;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
cin >> n;
for(; n--;) {
int x;
cin >> x;
cout << get(x) << " ";
}
return 0;
}
方法二
x &= x-1
可以将二进制数中的最低的 1 变为 0,每次应用可以逐步减少 1 的个数,从而快速计算 1 的个数。
#include <iostream>
using namespace std;
int get(int x) {
int ans = 0;
while(x) {
x &= x-1;
ans++;
}
return ans;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
cin >> n;
for(; n--;) {
int x;
cin >> x;
cout << get(x) << " ";
}
return 0;
}
方法三
库函数 __builtin_popcount(x)
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
cin >> n;
for(; n--;) {
int x;
cin >> x;
cout << __builtin_popcount(x) << " ";
}
return 0;
}