『算法-ACM竞赛-算法-lowbit』算法竞赛进阶指南-lowbit运算,找到二进制下所有是1的位

『算法-ACM 竞赛-算法-lowbit』算法竞赛进阶指南-lowbit 运算,找到二进制下所有是 1 的位

写在前面:我们主要还是分享算法的模板,而不是去刨析算法的原理!

主要思想是,对于非负整数 n,输出 n 最低位的 1 所在位,并不断把 n 赋值成 n-(n&-n),直至 n=0。
为了提高效率,我们使用 Hash 代替取 log,并且利用一个数学技巧:对于任意在[0,35]中的 k,2^k%37 互不相等,且恰好取遍整数 1~36。

1
2
3
4
5
6
7
8
9
10
11
12
// lowbit运算,找到二进制下所有是1的位
int H[37];
// 预处理
for (int i = 0; i < 36; i++) H[(1ll << i) % 37] = i;
// 对多次询问进行求解
while (cin >> n) {
while (n > 0) {
cout << H[(n & -n) % 37] << ' ';
n -= n & -n;
}
cout << endl;
}

其他两种实现:

1
2
3
4
5
6
7
8
9
10
11
int lowbit(int x)
{
return x&(-x);
}


int lowbit(int x)
{
return x&(x^(x-1));
}


『算法-ACM竞赛-算法-lowbit』算法竞赛进阶指南-lowbit运算,找到二进制下所有是1的位
https://chiamzhang.github.io/2024/06/29/『算法-ACM竞赛-算法-lowbit』算法竞赛进阶指南-lowbit运算,找到二进制下所有是1的位/
Author
Chiam
Posted on
June 29, 2024
Licensed under