我必须以某种方式处理Java中的8字节无符号整数类型。

我的8字节无符号整数存储在由ByteBuffer包装的字节数组中。它来自数据记录器数据库,包含非常大的数字。

这就是我处理4字节整数以将其读取为无符号整数的方式:

((long) (bytebuffer.getInt() & 0xFFFFFFFFL));

不幸的是:
((BigInteger) (bytebuffer.getLong() & 0xFFFFFFFFFFFFFFFFL));

不起作用。

如何存储数字 2 ^ 64-1 并将其读取为 2 ^ 64-1

最佳答案

在Java的long中,最高有效位为-(263)。如果未签名,则该位的值应为正263。其差值为264。

首先,使用BigInteger值创建long。然后,如果为负,则通过向1 << 64添加264或BigInteger来应用无符号校正。

BigInteger result = BigInteger.valueOf(bytebuffer.getLong());
if (result.compareTo(BigInteger.ZERO) < 0) {
    result = result.add(BigInteger.ONE.shiftLeft(64));
}

09-09 21:49
查看更多