我有一个大小为 8(64 位(的字节数组序列。我想将相应的自然数放入一个变量(原始类型(,因此我想使用双精度变量,因为其他原始类型不支持如此高的范围(从 0 到 2^64(。
我举一个例子:
我有以下字节数组
000000 0000000 0000000 0000000 0000000 0000000 0000000 0000010
对应的自然数是2。
我试过这个:
double bigNaturalNum = new BigInteger(byteArray).doubleValue();
问题是 doubleValue(( 方法返回字节表示的双精度值,因此结果值可以是十进制值。
这取决于byte[]
中最高有效位是否用作符号位,例如 2 的补码。如果是这样,您可以使用ByteBuffer
将byte[]
映射到long
:
byte[] arr = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
long l = ByteBuffer.wrap(arr).getLong();
System.out.println(l); // -1
System.out.println(Long.toHexString(l)); // ffffffffffffffff
如果不是,则应将BigInteger
与signum=1
一起使用,以指示不使用符号位:
byte[] arr = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };
BigInteger i = new BigInteger(1, arr);
System.out.println(i); // 18446744073709551615
我终于解决了将值存储在long
变量中的问题。Java 没有无符号长原始类型,但从 JavaSE 8 开始,您可以通过类 Long Long - JavaSE 8 的方法将 long 变量视为无符号长变量。
例如,您可以使用该方法public static int compareUnsigned(long x, long y)
比较两个长整型值,以数字方式将这些值视为无符号。
通过这种方式,您可以在一个长变量中存储 2^64 个自然 nuber。