【发布时间】:2014-11-20 22:10:38
【问题描述】:
我想访问一个大整数的某些部分。特别是,我想将大整数分成 4 个相等的部分。如果位长不能被 4 整除,我希望添加足够多的前导零以使长度成为 4 的倍数。我有以下代码按描述工作:
public static BigInteger[] partition(BigInteger a) {
int base = (a.bitLength()+3)/4;
BigInteger upper = a.shiftRight(2*base);
BigInteger lower = a.subtract(upper.shiftLeft(2*base));
BigInteger a2 = lower.shiftRight(base);
BigInteger a1 = lower.subtract(a2.shiftLeft(base));
BigInteger a4 = upper.shiftRight(base);
BigInteger a3 = upper.subtract(a4.shiftLeft(base));
return new BigInteger[] {a1, a2, a3, a4};
}
此代码的问题在于创建许多额外的大整数以及许多不必要的移位和减法的开销。也许可以添加一个测试来确保a 至少有 4 位,但在我的情况下这不是必需的,因为在调用函数之前我知道这是正确的。
有没有办法扩展 BigInteger 类并直接使用 int[] mag 数组?扩展类应该有类似于上面给出的partition 的东西,它返回一个由 4 个不可变 BigInteger 值组成的数组。
【问题讨论】:
标签: java biginteger