原理1:

3^10=3*3*3*3*3*3*3*3*3*3

//尽量想办法把指数变小来,这里的指数为10

3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3)

3^10=(3*3)^5

3^10=9^5
```c++
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power % 2 == 1) {//指数是奇数时,将底数乘以自身,并使指数-1
result = result base;
}
power = power / 2;
base = (base
base) ;
}
return result;
}


##原理2:
在C语言中,power%2==1可以用更快的“位运算”来代替,例如:power&1。因为如果power为偶数,则其二进制表示的最后一位一定是0;如果power是奇数,则其二进制表示的最后一位一定是1。将他们分别与1的二进制做“与”运算,得到的就是power二进制最后一位的数字了,是0则为偶数,是1则为奇数。例如5是奇数,则5&1=1;而6是偶数,则6&1=0;因此奇偶数的判断就可以用“位运算”来替换了。

例如
![最后一位数是和1取与是1就是奇数不然就是偶数][1]

![向右移一位就可以使数字减半][2]

所以代码:
```c++
typedef long long ll;
ll ksm(ll a,ll b) {//a为底数,b为指数
ll ans = 1;//ans为结果

while (b) {
    if (b & 1) {
        ans = ans * a;
    }
    b = b >> 1;
    a = a * a ;
}
return ans;

}



  [1]: https://img-blog.csdnimg.cn/20190103143841293.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE5NzgyMDE5,size_16,color_FFFFFF,t_70
  [2]: https://img-blog.csdnimg.cn/20190103144259337.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE5NzgyMDE5,size_16,color_FFFFFF,t_70