数值的整数次方
关键是幂次为负数的情况。。。
思路
n为正数
快速幂
以上例说:将2的13次方拆分为2^1 乘 2^4 乘 2^8
n=13 ---->1+4+8(2的幂次) 0b1101
x = 3 (3 x 3^4 x 3^8)
用移位操作的方式来理解这道题.。。。。
while (n>0){
//从右往左遍历幂次的二进制
if(n%2==1){
total = total*x;
}
//每次就变大一位。。 (比如2^1 2^2 2^3 2^4 ....)
x = x*x;
//幂次每次右移一位
n = n>>1;
}
package swordPointingToTheOffer;
public class Sixteen {
//x的n次方
public static double myPow(double x, int n) {
double total = 1;
while (n>0){
//从右往左遍历幂次的二进制
if(n%2==1){
total = total*x;
}
//每次就变大一位。。 (比如2^1 2^2 2^3 2^4 ....)
x = x*x;
//幂次每次右移一位
n = n/2;
}
return total;
}
public static void main(String[] args) {
System.out.println(13/2);
System.out.println(myPow(3,3));
}
}
n为负数
if(n<0){
n = -n;
x = 1/x;
}
注意:
long n2 = n;
package swordPointingToTheOffer;
public class Sixteen {
//x的n次方
public static double myPow(double x, int n) {
double total = 1;
long n2 = n;
if(n<0){
n2 = -n2;
x = 1/x;
}
while (n2>0){
//从右往左遍历幂次的二进制
if(n2%2==1){
total = total*x;
}
//每次就变大一位。。 (比如2^1 2^2 2^3 2^4 ....)
x = x*x;
//幂次每次减少一位
n2 = n2>>1;
}
return total;
}
public static void main(String[] args) {
// System.out.println(13>>1);
System.out.println(myPow(2,-2147483648));
}
}