算法快速幂1.快速幂概念

第一次写博客 引用了算法书中的内容 可以填原创吗?请大佬指正

如何快速求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;

}

这段代码是使用二进制位运算来实现快速幂运算的方法,下面我将用中文来解释位运算的原理。

位运算是一种对二进制数的操作方法,它可以高效地执行一些常见的数学运算,如乘法、除法和幂运算。在这段代码中,主要使用了两个位运算操作:按位与运算 & 和右移运算 >>

  1. 按位与运算 n & 1

    • 这个操作用来检查二进制数 n 的最低位(最右边的位)是否为1。如果最低位为1,结果为1;如果最低位为0,结果为0。这是因为只有1和1的按位与操作结果为1,其他情况下结果都是0。
    • 在这段代码中,用于检查当前幂指数 n 的最低位是否为1,以决定是否要将 base 乘以 res
  2. 右移运算 n >>= 1

    • 这个操作将二进制数 n 向右移动一位,相当于将其除以2(取整数部分),同时丢弃最低位。这实际上是在将二进制数 n 的幂指数减半。
    • 在这段代码中,用于将幂指数 n 减半,这是因为每次迭代都在处理 n 的二进制表示中的下一个位。

通过这两种位运算操作,代码能够以非常高效的方式计算 an 次方,减少了乘法操作的次数,从而提高了计算速度。这就是为什么它被称为快速幂运算。

例子:

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最后一位去掉

    }

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值