# 二进制中 1 的个数 - 位运算
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int lowbit(int x){
return x & -x;
}
int main(){
int n;
cin >> n;
while(n--){
int x;
cin >> x;
int res = 0;
while(x) x -= lowbit(x), res++;
cout << res << ' ';
}
return 0;
}
#include <iostream>
using namespace std;
int lowbit(int x){
return x & -x;
}
int main(){
int n;
cin >> n;
while(n--){
int x;
cin >> x;
int res = 0;
while(x) x -= lowbit(x), res++; //每次减去x的最后一位;
cout << res << ' ';
}
return 0;
}
# 位运算常用操作
n 的二进制表示第 k 位是几
1. 先把第 k 位移到最后一位 n >> k
2. 看个位是几 x & 1
1.2. 结合一下 n >> & 1
看一下 n 的二进制第 k 位是几
lowbit (x) 返回 x 的最后一位
x = 1010 lowbit (x) = 10
x = 101000 lowbit(x) = 1000
x & -x = x & (~x + 1)
x = 1010...100...0
~x = 0101...011...1
最后一位 1 的位置变成 0 之后全变 1
~x + 1 = 0101...100...0
取反 + 1 即最后一位 0 的位置变成 1
x & (~x + 1)= 0000...100...0
x & (~x + 1) 应该是最后 x 一位 1 接下来全是 0