我必须以某种方式处理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));
}