算法模版:非递归快速幂算法详解

 1 // 计算a^b
 2 long long quick_power(long long a, long long b) {
 3     long long result = 1;
 4     while (b) {
 5         if (b & 1) result *= a; // 判断最后一位二进制位数是否为1
 6         b >>= 1; // 右移位一位
 7         a *= a; // a在下一位的基数应该是上一位的a倍
 8     }
 9     return result;
10 }

算法解释:

比如a=2, b=15

那么正常应该是有15个2相乘

这个优化算法中是这么做的,15 = 8 + 4 + 2 + 1

那么简化为2^8 * 2^4 * 2 ^ 2 * 2^1

而15转化为2进制是:1111,每一位对应一个基系数,如果为0则不作处理,如果为1则在累积结果中乘上对应基的值。

让a作为基数,在循环中代表这次循环中如果应该计算的话应该乘多少进去,即上例中,a在每次循环中分别是2, 4, 16, 32, 即2^1 2^2 2^4 2^8。

我们来判断b的二进制数的最后一位是不是为1来决定是否算进去这位。

原文地址:https://www.cnblogs.com/laiy/p/4365226.html