【发布时间】:2020-03-06 06:39:43
【问题描述】:
我需要一种将 BigInteger(1000 字节)除以 3 的快速方法。因为移位不起作用,我必须使用 divideAndReminder()。有更好/更快的选择吗?我经常使用这个,所以很可能 jit 会优化它。
public byte[] div3(BigInteger big) {
final List<Byte> al = new ArrayList();
final BigInteger three = BigInteger.valueOf(3);
while(!big.equals(BigInteger.Zero)){
final BigInteger[] bigg = big.divideAndReminder(three);
al.add(bigg[1].byteValueExact());
big = bigg[0];
}
return toByteArray(al);
}
换档可以更快地完成吗?
【问题讨论】:
-
(可以使用迭代移位和加/减来完成 - 对于单词操作和没有有用除法的机器很有用。我没有看到任何延续到 multi-word/math.BigInteger。(也就是说,Oracle 运行时包含一个用于乘法的
private exactDivideBy3()。)) -
不确定是否更快,但你试过
BigInteger.toString(3)吗? -
(@user85421:FWIW,Oracles
toString(radix)在 Schönhage 基数转换的实现中使用divideAndRemainder()-。) -
(@greybeard 它也使用了一个可变的
BigInteger(不是public),所以它至少有一个优势)
标签: java algorithm math biginteger integer-division