1. 程式人生 > >快速冪 (二進位制)這個好像一般不會爆掉!!

快速冪 (二進位制)這個好像一般不會爆掉!!

int poww(int a, int b) {
   int ans = 1, base = a;

    while (b != 0) {       //如果b的所有位都被踢掉 也就是b不存在了 那麼就沒有指數了 就算不出下去了 也沒有可以算得了 也不需要算了 就可以跳出迴圈
         if (b & 1 != 0)    //判斷b的二進位制的最後一位是否1 如果b & 1 != 0  也就是b(二進位制)的最後一位等於1(不等於0) b此時是奇數

            ans *= base;  //(在if語句中的 )如果指數是奇數的話 ((((看下面)))))
            base *= base; // 這步相當於讓a指數變成(2^權)
           
b >>= 1;          //把b(二進位制)的最後一位踢掉(在就不存在了)

    }
     return ans;
 }

 

 

以2的11次方為例

2^11

  11的二進位制為1101

  所以11=1*2^3 + 1*2^2 + 0*2*1 + 1*2^0      

  a^11=a^(1*2^3 + 1*2^2 + 0*2*1 + 1*2^0)

     =a^(1*2^3)   *   a^(1*2^2)  *   a^(0*2*1)   *  a^(1*2^0)

if (b & 1 != 0)    一步步判斷b的二進位制的每一位  如果是零 即指數為0*~~ 0乘任何數肯定等於0了啊  所以某一位一旦指數等於0 就可以相當於那一步乘法因數是1 就完全可以忽略它了