【问题标题】:Java BigInteger to represent unsigned longJava BigInteger 表示 unsigned long
【发布时间】:2012-07-23 03:45:32
【问题描述】:

我正在尝试使用BigInteger 表示来自 Java 中的 C 的无符号 64 位 (long),我的方法与以下帖子中提到的完全相同。

http://technologicaloddity.com/2010/09/22/biginteger-as-unsigned-long-in-java/

请大家验证一下这种方法是否正确?

感谢您提供这方面的任何帮助。

【问题讨论】:

    标签: java long-integer biginteger unsigned


    【解决方案1】:

    当然可以,但你真的需要吗?有很大的性能成本。唯一需要它的无符号是在比较时,您可以使用一个小的无符号比较方法来修复它。剩下的时间你可以只用long。

    【讨论】:

    • +1,不需要自己写方法。我确信存在许多用于进行无符号操作的库;番石榴是其中之一:docs.guava-libraries.googlecode.com/git/javadoc/com/google/…
    • 感谢您的确认。用例对性能不是很敏感,所以我不太关心这一点。仍然为了更好地理解,如果我按照你提到的那样使用 long,那么 case unsigned c Long.MAX 将如何映射到 java long。或者可能是我错过了一点。 @Mark,我遇到了番石榴库,但在我的情况下,我只有一个场景需要这个操作,所以没有带来新的库。
    • 如果性能不是问题,那么我会亲自使用 Guava UnsignedLong 包装器,因为它消除了数字所代表的任何歧义。
    • @Aham A long 有 64 位,无论有符号还是无符号。唯一的区别是它是否比较 是, 不只是“映射到”0x8000000000000001,除非我再次弄乱了我的二进制补码。
    • 您可以将两个无符号长整数与a + Long.MIN_VALUE <=> b + Long.MIN_VALUE 进行比较,其中<=> 是您选择的比较对象。对于==!=,您只需比较ab。操作+-<<>>>* 的工作方式相同。如果设置了最高位,/ 和 '%' 是不同的。
    猜你喜欢
    • 2016-07-29
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多