位运算不直接实现幂次转换,而是支撑快速幂算法:通过b&1判断指数二进制位、b>>=1推进位、a=aa维护幂次、res=resa条件累乘,将时间复杂度降至O(log b)。

位运算本身不直接“实现幂次转换”,但它是快速幂算法高效落地的核心支撑。关键在于:用位运算判断指数二进制位、控制底数平方节奏、完成条件累乘——整个过程没有真正做“幂次转换”,而是把幂运算拆解为左移/右移、与运算、乘法的组合,从而将时间复杂度从 O(b) 降到 O(log b)。
用位运算驱动快速幂的标准流程
核心是把指数 b 看作二进制串,例如 b = 13 → 1101₂,对应 a¹³ = a⁸ × a⁴ × a¹。只需在 b 的每一位为 1 时,把当前幂次(a¹, a², a⁴, a⁸…)乘入结果。
-
判断当前位是否为 1:用
b & 1,比b % 2 == 1更快更安全 -
推进到下一位:用
b >>= 1(等价于b /= 2向下取整),比除法运算开销小 -
维护当前幂次项:每次循环让底数自乘,即
a = a * a,这对应二进制位权翻倍(a¹ → a² → a⁴ → a⁸…) -
只在需要时累积:当
b & 1为真,执行res = res * a,相当于把 a^(2^k) 加入乘积
左移右移在快速幂中的真实角色
左移(<<)和右移(>>)在这里不是用来“转换数值”,而是高效模拟二进制位操作:
-
b >> 1是读取指数二进制位的“指针移动”,每次扔掉最低位,准备看下一位 -
1 << k常用于构造掩码或预计算 2 的幂,但在标准快速幂主循环中不直接参与幂值计算 - 注意:不要混淆
a << 1(a×2)和快速幂中的a = a * a(a²)——前者是线性缩放,后者是指数级增长,不可替代
带模运算的实用写法(防溢出)
实际应用(如密码学、算法题)中,aᵇ 往往需对 mod 取模。位运算优势在此进一步放大:
- 每次乘法后立即取模:
res = (res * a) % mod和a = (a * a) % mod - 先对底数取模:
a %= mod,避免初始值过大导致第一次平方就溢出 - 位判断仍用
b & 1,不受模影响;右移仍用b >>= 1,因整数除法性质保持不变
一个典型 C++ 实现(含注释)
typedef long long ll;
ll qpow(ll a, ll b, ll mod) {
ll res = 1;
a %= mod;
while (b > 0) {
if (b & 1) res = res * a % mod; // 当前位是1,累乘当前幂次
a = a * a % mod; // 底数平方,准备下一位对应的幂
b >>= 1; // 指数右移,处理更高位
}
return res;
}

















