4

我需要用 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 可以随心所欲地大。

4

2 回答 2

7
  1. 16^(n - i -1)=2^(4 * (n - i -1))
  2. 2^x=1 << x.

因此:16^(n-i-1)=1 << (4 * (n -i -1))

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

于 2012-09-14T22:22:48.073 回答
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;
}
于 2017-01-12T12:11:52.197 回答