SGI STL power函数 思想总结笔记
在看侯捷STL源码剖析时,看到power函数时,有点犯晕。感觉和在其他算法书上看到的不太一样,怎么也理解不了,依稀记得编程之美上有相关问题的讨论。
然后google了下,找到下面这篇文章:http://blog.csdn.net/ariesjzj/article/details/6413258
才突然对SGI power的思想有些理解。故做笔记记录一下。
首先,复习一下计算机导论上讲的关于十进制数用二进制表示的内容,即一个十进制数N = (2^0) * N0 + (2^1) * N1 + (2^2) * N2 + ... + (2^k) * Nk;公式一
比如十进制数10 = 2^1 + 2^3;
既然有了任意一个十进制数N的二进制表示,那自然就有数学里面的十进制N幂次方的表示法:X^N = X ^ (此处为上述N的二进制表示)。公式二
结合公式一、二即有:X^N = X * ((2^0)*N0) + X ^ ((2^1)*N1) + X ^ ((2^2)*N2) + ... X ^ ((2^k)*Nk);公式三
然后代码就比较简单了。代码步骤分解如下:
步骤一:先找到N的二进制表示里面最低2的次幂的地方k1,即代码里面的P8的while循环
步骤二:找到了第一个2^k之后,后续的X ^ ( 2^(k+1) )就等于( X ^ (2^k) ) ^2,即代码里面的P18
步骤三:然后依次循环,来计算N的二进制表示里,每一位的情况。根据N的每一位情况,来计算X的幂次方。(即:公式三),代码里P19的if语句
源代码如下(非Ctrl+C /Ctrl+V SGI power,读者应自行去看原始代码,此只为帮助理解上述的三个步骤)
1 template <typename Type, typename Integer> 2 Type 3 power(Type x, Integer n) 4 { 5 if ( n == 0) { return 1; } 6 else 7 { 8 while ((n&1) == 0) 9 { 10 x = x * x; 11 n >>= 1; 12 } 13 14 Type result = x; 15 n >>= 1; 16 while ( n != 0) 17 { 18 x = x * x; 19 if ((n&1) != 0) 20 { 21 result = result * x; 22 } 23 n >>= 1; 24 } 25 26 return result; 27 } 28 29 }