美文网首页
数值的整数次方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