zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Java:类加载器(ClassLoader)
    Java 并发:Executor
    Java 并发:线程中断-interrupt
    UNIX IPC: POSIX 消息队列 与 信号
    Java与C++区别:重载(Overloading)
    UNIX IPC: POSIX 消息队列
    PAT 1078. Hashing
    PAT 1032. Sharing
    回顾经典问题算法:LIS, LCS-(DP类别)
    url编码模块
  • 原文地址:https://www.cnblogs.com/ziyoudefeng/p/2594852.html
Copyright © 2011-2022 走看看