第一次写博客 引用了算法书中的内容 可以填原创吗?请大佬指正
如何快速求2的11次方?
将11分为8 2 1 都是2的倍数 用2进制处理(2的3次方 2的1次方 2的0次方,对应的是1011)
如何跳过中间的0?用&运算判断(& ^ |相关操作建议学一下)
int fastPow(int a,int n){
int base=a;
int res =1;
while(n){
if(n&1)
res*=base;
base*=base;
n>>=1;
}
return res;
}
这段代码是使用二进制位运算来实现快速幂运算的方法,下面我将用中文来解释位运算的原理。
位运算是一种对二进制数的操作方法,它可以高效地执行一些常见的数学运算,如乘法、除法和幂运算。在这段代码中,主要使用了两个位运算操作:按位与运算 &
和右移运算 >>
。
-
按位与运算
n & 1
:- 这个操作用来检查二进制数
n
的最低位(最右边的位)是否为1。如果最低位为1,结果为1;如果最低位为0,结果为0。这是因为只有1和1的按位与操作结果为1,其他情况下结果都是0。 - 在这段代码中,用于检查当前幂指数
n
的最低位是否为1,以决定是否要将base
乘以res
。
- 这个操作用来检查二进制数
-
右移运算
n >>= 1
:- 这个操作将二进制数
n
向右移动一位,相当于将其除以2(取整数部分),同时丢弃最低位。这实际上是在将二进制数n
的幂指数减半。 - 在这段代码中,用于将幂指数
n
减半,这是因为每次迭代都在处理n
的二进制表示中的下一个位。
- 这个操作将二进制数
通过这两种位运算操作,代码能够以非常高效的方式计算 a
的 n
次方,减少了乘法操作的次数,从而提高了计算速度。这就是为什么它被称为快速幂运算。
例子:
2的11次方 11的二进制为1011. 函数第一轮的时候,(n&1)判断最右是否为1,如果是1就开始计算 :
while(n){
if(n&1)//判断此刻最后一位是否为0,当n为0,res不变
res*=base;//计算,初始res为1,base为你输入的底数
base*=base;//随着n每向右移一位 base增加一次方 二进制从右到左就是0次方依次递增
n>>=1;n的最后一位判断完之后,向右移一位,把刚处理过的n最后一位去掉
}