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来决定是否算进去这位。