将bignum解析为16位整数列表

时间:2010-01-11 11:54:50

标签: algorithm parsing bignum

我必须实施一些bignum算术。该数字必须分成16位整数列表。

这不是问题。问题是将字符串解析为此表示法。如果它是一个整数,我将向后遍历字符串,从字符中获取数字并添加< number> * 10 ^ stringposition。 (最后一个char在此示例中具有stringposition 1)

但是bignum不应该有乘法,我应该有一个更聪明更快的方法。 (int乘法是O(1); bignum乘法不是)

怎么做?

(我不能使用像gmp这样的完整库)

2 个答案:

答案 0 :(得分:2)

我认为没有一个好方法可以做到这一点,因为内部表示实际上是2 ^ 16基础。您需要将基于10的数字转换为基于2 ^ 16的数字。

不要使用x * 10 ^(位置x),因为在2 ^ 16 base中没有10 ^ n的表示。你可以做点什么

num = 0
for i=0 to len do
  num = num * 10 + a[i]

答案 1 :(得分:2)

在Java中,您可以使用java.math.BigInteger类来解决您的问题。

  1. 从String输入中创建一个BigInteger:

    BigInteger x = new BigInteger(s);

  2. 获取一个包含此BigInteger的二进制补码表示的字节数组:

    byte[] b = x.toByteArray();

  3. 将字节数组转换为int [],将连续的8位值对合并为16位值,如下所示:

    int[] merge(byte[] b) {
        int[] result = new int[((b.length-1)>>1) + 1];
        for (int i = 0; i < b.length; i++) {
             result[i>>1] |= b[b.length-i-1] << ((i&1)<<3);
        }
        return result;
    }