Java Bitshift取代Math.pow

时间:2012-09-14 22:18:11

标签: java math pow

我需要用bitshift替换Java中的Math.pow。

for (int i = n - 1; i >= 0; i--)
    Math.pow(16, n - i - 1)

其中n是十六进制数的长度 13304fb意味着n = 7 它基本上是将十六进制转换为十进制。

现在我需要用Bitshift替换Math.pow。我无法弄清楚,因为n可以达到它想要的那么大。

2 个答案:

答案 0 :(得分:5)

  1. 16^(n - i -1) = 2^(4 * (n - i -1))
  2. 2^x = 1 << x.
  3. 因此:16^(n-i-1) = 1 << (4 * (n -i -1))

    (使用^符号表示“对于”的权力,而不是XOR)

答案 1 :(得分:0)

更通用的方式:

public static double posIntPow(final double pVal, final int pPow) {
    double ret = 1;
    double v1, v2;
    int n = pPow;
    v1 = pVal;
    if ((n & 1) == 1) {
        ret = pVal;
    }
    n = n >>> 1;
    while (n > 0) {
        v2 = v1 * v1;
        if ((n & 1) == 1) {
            ret = ret * v2;
        }
        v1 = v2;
        n = n >>> 1;
    }
    return ret;
}