acwing基础课ch1-位运算
约 317 字
预计阅读 1 分钟
位运算
位的统计问题
计算n的二进制表示中第k位
lowbit(x)运算:返回x的最后一位1的位置
-
-x = ~x + 1
-
x & -x
-
1010 ->10
-
101000 -> 1000

二进制中1的个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <iostream>
using namespace std;
const int N = 1e5+10;
int a[N], n;
void cal_bits(int& x){
int res = 0;
while(x){
if(x & 1) res += 1;
x = x >> 1;
}
x = res;
}
int main(){
cin >> n;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = 0; i < n; i++){
cal_bits(a[i]);
printf("%d ", a[i]);
}
return 0;
}
|
x & (-x)->low_bit(x)
得到二进制中最右边的1的位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream>
using namespace std;
const int N = 1e5+10;
int x, n;
int low_bits(int x){
return x & (-x);
}
int main(){
cin >> n;
for(int i = 0; i < n; i++){
scanf("%d", &x);
int res = 0;
while(x) {
x = x - low_bits(x);
res += 1;
}
cout << res << ' ';
}
return 0;
}
|