Java: 实现一个无符号的128位整数

11

首先我应该问一下:
有人知道Java中当前实现128b UINT的方法吗?

我需要一些可以容纳自然数值的东西。例如:一个巨大的计数器。
我知道BigIntegers,但它们速度慢且不可变。一个128b UINT很有道理...

我考虑使用一对原始longs来实现OWORD。

溢出会抛出异常而不是进行环绕。

实现该类的工作应查看什么示例源代码/博客?


我一年前实现了类似的东西,我只能说:我真希望你不必实现精确的模数/除法... ;) - Tim
2
你可以从OpenJDK中获取MutableBigInteger http://www.docjar.org/html/api/java/math/MutableBigInteger.java.html - akarnokd
3个回答

3

我会使用32位整数作为表示方式,因为你需要更大的类型(长整型)来获得进位比特、溢出检测和乘法的额外精度。把32位整数看作一位数字并应用小学算法即可。


1
你可以很好地使用64位长整型,速度快了一倍。通过改变符号位可以确定进位。 - Ira Baxter
@Ira Baxter 我怀疑这样做不会更快。虽然对于加法来说可能是可行的,但对于乘法来说则更为复杂。Java BigInteger使用int[],我想他们知道自己在做什么。 - starblue
如果您想要一个非常高性能的BigInt包,您应该使用机器可用的最大字长,并且有本地机器指令支持。现在很难找到不是64位的PC。我坚持我的立场:使用long。 BigInt包中的算法可能是大多数多精度包的典型;long应该相对容易地适应。现在添加大的bigints只需要一半的周期。乘法应该快4倍,因为您只需要1个乘积而不是4个半宽交叉乘积。 - Ira Baxter
我可能会稍微缓和一下:你想要获得从两个单精度乘积中得到双精度结果的最大位集。在Java中,将int强制转换为long可以以与Java无关的方式满足这一需求,这在某种程度上证明了你的回答是正确的。如果你需要速度,你可以进入本机机器代码。在x86上,浮点单元至少提供80位精度,这意味着你可能希望选择40位的“数字”。 - Ira Baxter

2
不要告诉我你计划拥有128个静态setter和getter,每个位都有一个???我肯定会选择setBit(int index, boolean value)和getBit(int index)作为实例方法。
还需要更多的东西:toString()方法,这样您就可以获得人类可读的表示(在某些时候,我认为您会想要打印数字)。
请记住,Java中的所有序数类型都是带符号的(除了char),因此如果您计划使用两个long类型,请始终牢记较低部分可能会对检测溢出等产生问题...无论如何,您将拥有127位数字,除非因为较低部分将被视为63位无符号。

1
OP在哪里暗示每个位都有setter方法? - Ira Baxter
在批评之前,你应该先看一下这个:http://stackoverflow.com/revisions/1096964/list - fortran
1
好的,现在我明白了。我没想到我得阅读一个问题的修订版本才能理解它;这似乎有点过头了。我已经取消了对你的回答的否定评价。 - Ira Baxter
只翻译文本内容:不要理解它,但不要期望人们每次问题更新时都回来更改他们的答案(因为它没有通知)... - fortran

-2

为什么不使用BigInteger?


11
当你只需要略微超过 64 位时,BigInteger 的速度非常缓慢。一年前我遇到了这个问题,结果发现比原始的 long 类型慢了 25 倍。有关详细信息,请参阅此答案:http://stackoverflow.com/questions/962747/most-shameful-awesome-language-hack/1084538#1084538 - Tim
9
奇怪的是这被接受为答案,考虑到原帖作者说他不想使用 BigInteger。 - Ira Baxter
4
Tim,你的评论包含一个错误的链接。 - Gili

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接