我想访问一个大整数的某些部分。特别是,我想将大整数分成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值的数组。
答案 0 :(得分:3)
事实上我并没有完全解决你的问题。希望我回答你的意思:)。
在BigInteger
中,它确实提供了toByteArray()
,它返回byte[]
,其中包含BigInteger
本身的2个赞美表示。同时有一个构造函数使用byte[]
。
因此,您的解决方案可以像获取字节数组一样简单,按照您想要的任何脏方法对字节数组进行分区,并相应地创建每个结果BigInteger。这样可以避免您根据自己的需要创建大量不必要的BigInteger
。