我必须实施一些bignum算术。该数字必须分成16位整数列表。
这不是问题。问题是将字符串解析为此表示法。如果它是一个整数,我将向后遍历字符串,从字符中获取数字并添加< number> * 10 ^ stringposition。 (最后一个char在此示例中具有stringposition 1)
但是bignum不应该有乘法,我应该有一个更聪明更快的方法。 (int乘法是O(1); bignum乘法不是)
怎么做?
(我不能使用像gmp这样的完整库)
答案 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
类来解决您的问题。
从String输入中创建一个BigInteger:
BigInteger x = new BigInteger(s);
获取一个包含此BigInteger的二进制补码表示的字节数组:
byte[] b = x.toByteArray();
将字节数组转换为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; }