偶数 A(n) = A(n/2) * A(n/2)
奇数A(n) = A((n-1)/2) * A((n-1)/2)
指数为0或小于1 怎么办?
底数为0 时返回什么?
* 2 ^ 4 = 16 4D = 100B
* res = power(2,2) -> power(2,1) -> 2
* |
* res&1=1
* 2*2
* 4*4
*/
public class 数值的整数次方 {
public static double power(double num, int exp) {
if (exp < 0)//解决负数问题
return 1 / power(num, -exp);
if (exp == 0)
return 1;
if (exp == 1)
return num;
double res = power(num, exp >> 1);
res = res * res;
if ((exp & 1) == 1)
res = res * num;
return res;
}
public static void main(String[] args) {
System.out.println(power(2, 4));
System.out.println(power(2, -2));
}
}
用右移运算替代了除以2
用位与运算符替代了求余运算符(%)来判断奇偶
当需要对2的次幂进行求余时,可以是使用&运算符来代替
a/b的除数b必必须为2的n次方
使用位操作(&运算)代替求余操作
%运算:a%b
由于我们知道位运算比较高效,在某些情况下,当b为2的n次方时,有如下替换公式:
a % b = a & (b-1)(b=2n)
即:a % 2n = a & (2n-1)
例如:14%8,取余数,相当于取出低位,而余数最大为7,14二进制为1110,8的二进制1000,8-1 = 7的二进制为0111,由于现在低位全为1,让其跟14做&运算,正好取出的是其低位上的余数。1110&0111=110即6=14%8;(此公式只适用b=2n,是因为可以保证b始终只有最高位为1,其他二进制位全部为0,减去1,之后,可以把高位1消除,其他位都为1,而与1做&运算,会保留原来的数。)
网友评论