【问题标题】:Java: Implementing a Unsigned 128bit IntegerJava:实现无符号 128 位整数
【发布时间】:2009-07-08 09:01:32
【问题描述】:

首先我要问:
有谁知道当前的 Java 128b UINT 实现?

我需要一些东西来保持自然的基本价值观。即:一个巨大的柜台。
我知道 BigIntegers,它是缓慢且不可变的。 128b UINT 是有意义的......

我正在考虑使用一对原始 long 来实现一个 OWORD。

溢出会抛出异常而不是 Wraparound。

我应该查看哪些示例源代码/博客来实现此类的工作?

【问题讨论】:

标签: java integer implementation


【解决方案1】:

我会使用 32 位整数作为表示,因为您需要更大的类型(long)来获得进位、溢出检测和乘法的额外精度。将 32 位整数想象成一个数字,并应用小学的算法。

【讨论】:

  • 您可以使用 64 位 long 就可以了 ==> 快两倍。进位可以通过更改符号位来确定。
  • @Ira Baxter 我怀疑它会更快。加法是可能的,但更复杂,但乘法却不行。 Java BigInteger 使用 int[],我想他们知道自己在做什么。
  • 如果你想要一个非常高性能的 BigInt 包,你可以使用你的机器可用的最大字长,它有本地机器指令支持。现在很难找到不是 64 位的 PC。我坚持我的立场:使用多头。 BigInt 包中的算法可能是大多数多精度包的典型算法。 long 应该相对容易落入到位。现在添加大的 bigint 只需要一半的周期。乘法应该快 4 倍,因为您只需要 1 个乘积而不是 4 个半宽叉乘。
  • 我可能会稍微缓和一点:您需要最大的一组位,您可以从两个单精度乘法中获得双精度乘积。 Java ints cast as longs 以独立于 Java 的方式满足这一点,这在某种程度上证明了您的答案。如果您需要速度,您将使用本机机器代码。在 x86 上,FP 单元提供最低 80 位精度,这意味着您可能希望选择 40 位“数字”。
【解决方案2】:

不要告诉我你计划有 128 个静态 setter 和 getter,每个 bit 一个???我肯定会选择 setBit(int index, boolean value) 和 getBit(int index) 作为实例方法。

你需要更多的东西:一个 toString() 方法,这样你就可以获得人类可读的表示(在某些时候你会想要打印数字,我想)。

请记住,java 中的所有序数类型都是有符号的(char 除外),因此如果您打算使用两个 long,请始终记住,较低的部分可能会导致检测溢出等问题......无论如何,您将拥有一个 127 位的数字,除非因为较低的部分将被视为 63 位无符号数。

【讨论】:

  • OP 甚至在哪里提示每个位的设置器?
  • stackoverflow.com/revisions/1096964/list你应该先看看再批评。
  • 好的,现在我明白了。我没想到我必须阅读问题的修订才能理解它。这似乎有点过头了。我已经取消了您的回复。
  • 不理解,但不要指望每次更新问题时人们都会回来更改他们的答案(除其他外,因为它没有得到通知)......
【解决方案3】:

为什么不使用 BigInteger?

【讨论】:

  • BigInteger slow 当你所需要的只是超过 64 位.. 一年前遇到这个问题,结果比原来的 long 慢 25 倍.详情见此回答:stackoverflow.com/questions/962747/…
  • 奇怪的是这是公认的答案,考虑到 OP 说他不想要 BigInteger。
  • 蒂姆,您的评论包含一个损坏的链接。
猜你喜欢
  • 2020-07-06
  • 2016-10-11
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多