剑指 Offer 16. 数值的整数次方

文章介绍了一种利用位运算优化指数计算的方法,特别是在处理x的n次幂时,通过将指数转换为二进制形式,然后对x进行相应的位运算和乘法操作,从而高效地求解结果。代码示例展示了如何在C++中实现这一算法,特别考虑了指数为负的情况。
摘要由CSDN通过智能技术生成

一、问题描述

在这里插入图片描述

原题链接

二、解题思路

题目中给出底数x和指数n,一般思路是写一个循环n次的代码来解决问题,如果指数为负,将正的n计算所得的结果取倒数即可。这个方法就不在赘述。
换个思路,如果求x5,可以将其拆分成x5=x1*x0*x0*x4,对右边的x的指数结合在一起可以看成二进制的1001。对x进行位运算,遇到1就乘以相应大小的x次方,为了保证正确的次方,每一次循环都应该乘一次本身(因为每次右移一位等于除于2,所以要乘于当前的自身大小),依次求得最终解。

三、实现代码

class Solution {
public:
    double myPow(double x, int n) {
        if( n == 0) return 1;
        if( x == 0.0) return 0;
        long  exp = n;  //因为题目n的范围为-2^31~2^31-1,为了防止int取正时溢出,就用较大的long类型
        if(n < 0) {
            exp = n* (-1.0);
        } 
        
        double res = 1.0;
        while(exp != 0){
            if( (exp &1) == 1 ){
                res *=x;
            }
            x *=x;  //保证此时的x大小为对应位数的大小
            exp >>= 1;
        }

        return n<0 ? 1/res: res;  //如果指数为负数取倒数,如果为正就正常取值。
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值