【发布时间】:2012-04-20 17:41:09
【问题描述】:
我正在实现一个更快的BigInt 实现,但我不确定在提供与底层平台的互操作方面应该走多远。
今天BigInt 只是包装了一个BigInteger 并且值bigInteger 只是返回了包装的值:
class BigInt(val bigInteger: BigInteger) ...
因为我没有包装 Java 类型,所以我必须做类似的事情
final class BigInt private(final val signum: Int,
final private[math] val arr: Array[Int])
def bigInteger: java.math.BigInteger = {
// Avoid copying of potentially large arrays.
val ctor = classOf[java.math.BigInteger]
.getDeclaredConstructor(classOf[Array[Int]], classOf[Int])
ctor setAccessible true
ctor.newInstance(arr, signum.asInstanceOf[Object])
}
...
}
这会造成麻烦还是有更好的方法?
【问题讨论】:
-
我不知道这个数字有多大,但是复制一个小整数数组可能比使用反射更快...
-
是的,当然。小数组没关系,但数字的大小仅受 RAM 限制。在将数据从不可变数据结构移动到另一个数据结构时,我只是不想占用内存。
-
整个宇宙的原子数一般估计为10^80。只有 9*32 位,您可以为每个位分配唯一索引。我坚信,如果您需要一个比这更大的自然数,那可能是一个错误或设计错误......
标签: java scala math reflection biginteger