位运算在算法中的应用
快速幂
问题:
给定整数
分析:
我们可以将
其中
那么有:
并且我们知道
故我们只需要递推即可得出每个乘积项,当
代码:
int quickPower(int a, int b, int p) {
int ans = 1 % p;
while (b) {
if (b & 1) ans = (long long)ans * a % p;
b >>= 1;
a = (long long)a * a % p;
}
return ans;
}
例题:
龟速乘
问题:
给定整数
分析:
由于long long只能存
然后有
又因为
如果我们得到
同样当
代码:
long long mul(long long a, long long b, long long p) {
long long ans = 0;
while (b) {
if (b & 1) ans = (ans + a) % p;
a = (a * 2) % p;
b >>= 1;
}
return ans;
}
例题:
二进制状态压缩
将一个长度为
利用位运算实现原 bool 数组中对应下标元素的存取。
操作 | 运算 |
---|---|
取出 |
(n>>k) & 1 |
取出 |
n & ((1<<k)-1) |
将第 |
n xor (1<<k) |
将第 |
n | (1<<k) |
将第 |
n & (~(1<<k)) |
位运算的一个重要特点:在二进制表示下不进位,参与位运算的各个二进制位之间是独立无关的
例题:
成对变换
对于非负整数
当
当
因此,0和1、2和3、4和5...都是关于xor 1运算成对变换
常用于邻接表中无向边的存取
lowbit运算
lowbit(n) 定义为非负整数
因为在计算机中
所以有
通过 lowbit 运算,我们可以找到整数二进制表示下所有是
迭代计算
这里求对数可以预处理,建立一个长度为
int H[37];
for (int i=0;i<37;i++) H[(1ll << i) % 37] = i;
while (cin >> n) {
while (n > 0) {
cout << H[(n & -n) % 37];
n -= (n & -n);
}
}
lowbit也是树状数组的一个基本运算
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下