代码之家  ›  专栏  ›  技术社区  ›  Real Red.

如何使用BigType类实现Java中的无符号64位int?

  •  11
  • Real Red.  · 技术社区  · 17 年前

    我正在寻找一个精确容量为0到2^64-1的数据类型。我们知道Java本身不支持“无符号”禁止字符数据类型。

    BigInteger类允许创建长数据类型不支持的较大数字。但我不确定bigInteger类将如何满足我的目的。bigInteger类只允许通过构造函数赋值。我看到了下面的可能性,但它产生了一个随机数。

    BigInteger(int numBits, Random rnd) 
    Constructs a randomly generated BigInteger, uniformly distributed over the range 0 to (2^numBits - 1), inclusive.
    

    我看不到任何setvalue(x)类型的api可以让我为这个大整数选择自己的值。如何使用BigInteger类实现它,或者有其他方法来实现它吗?请邮寄代码样本。

    附言:有人提出的问题 here 没有实现详细信息。

    7 回复  |  直到 9 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    您通常可以使用Java签名的数字数据类型,就像它们是未签名的一样。

    看到这个 old answer 关于Java中的签名与无符号。

        2
  •  3
  •   mP.    17 年前

    为什么不自己写一个包装器,下面用一个有符号的long。如果用户希望将无符号值作为bigInteger获取,请测试符号并将2^64添加到bigInteger。

        3
  •  2
  •   Ingo    17 年前

    可以使用biginger.valueof(l)从long创建biginger,其中l是long。

    但如果你想用精确的64位,我会用长的。

        4
  •  2
  •   dfa    17 年前

    您可能需要创建一个uint64类,它封装了一个bigInteger;您还可以检查每个操作(add、mul等)是否返回一个无符号的64位bigInteger;模拟溢出可能很棘手

    class UInt64 {
    
        private final BigInteger value;
    
        private UInt64(BigInteger aValue) {
             // method to enforce your class invariant: 0...2**64-1
             checkInvariantOf(aValue);
             value = aValue; 
        }
    
        public static UInt64 of(String value) {
             return new UInt64(new BigInteger(value));
        }
    
        public UInt64 add(UInt64 v) {
             return new UInt64(value.add(v.value));
        }
    
        ....
    }
    
        5
  •  1
  •   unwind    17 年前

    BigInteger S是不变的,正如你所发现的。您可能希望研究大整数的子类化,并编写自己的构造函数来验证输入,并在相关范围内发出一个正的大整数。

    要保持数字只使用64位的要求,可能还需要重载各种操作,因此它们限制结果并返回新类的实例,而不是新的biginger。

    这可能是相当多的工作,但仍应远远好于从头开始做这一切。

        6
  •  1
  •   Peter Lawrey    17 年前

    可以将值0到2^64-1存储为长值。

    许多操作按预期工作,但是大多数api和一些操作仅在假定已签名的操作时工作,但是存在解决方法。

    然而,使用bigInteger可能更容易让你头脑清醒。;)

        7
  •  1
  •   crownus    10 年前

    在Java SE 8和以后,您可以使用长数据类型来表示一个无符号的64位长,它的最小值为0,最大值为2 ^ 64 -1。