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 }
原文地址:https://www.cnblogs.com/ziyoudefeng/p/2594852.html