美文网首页
数值的整数次方java

数值的整数次方java

作者: 凯玲之恋 | 来源:发表于2020-08-30 09:58 被阅读0次

偶数 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做&运算,会保留原来的数。)

容器类框架分析(4)(java)HashMap源码分析

参考

剑指:数值的整数次方java
使用位操作(&运算)代替求余操作

相关文章

网友评论

      本文标题:数值的整数次方java

      本文链接:https://www.haomeiwen.com/subject/uvgssktx.html