12、给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
解法来自:https://blog.csdn.net/weixin_42967016/article/details/85083307
核心要点:
1、<<:左移运算符,num<<1,相当于num乘以2;
>>:右移运算符,num>>,若二进制最后一位为0则相当于num除以2,若二进制最后一位为1则相当于num除以2余1;
>>>:无符号右移,忽略符号位,空位用0补齐;
2、对于一个整数a,a&1这个表达式可以用来判断a的奇偶性。二进制的末位为0表示偶数,末位为1表示奇数。
注意:其中要考虑指数的正负情况,若为负数时,底数不能为0。
public double Power(double base, int exponent) {
if(exponent < 0 && base == 0) throw new RuntimeException("分母不能为0");
int exp = Math.abs(exponent);
if(exponent == 0) return 1;
if(exponent == 1) return base;
//<< : 左移运算符,num << 1,相当于num乘以2
//>> : 右移运算符,num >> 1,相当于num除以2
//>>> : 无符号右移,忽略符号位,空位都以0补齐(负数用1补齐)
double result = Power(base, exp >>> 1);
result *= result;
//一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。
//二进制的末位为0表示偶数,最末位为1表示奇数。
//使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。
if((exp & 1) == 1) {
result *= base;
}
return exponent < 0 ? (1.0 / result) : result;
}