题目要求
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
核心思想
两个要点:
-
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐(负数用1补齐) -
一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。二进制的末位为0表示偶数,最末位为1表示奇数。使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。
完整代码如下
/**
* 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
*/
public class Solution {
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;
}
public static void main(String[] args) {
Solution sl = new Solution();
System.out.println(sl.Power(5.0, 3));
}
}