据报道,Java 8具有对无符号整数的库支持。但是,似乎没有文章解释如何使用它以及可能的程度。
Integer.CompareUnsigned等一些函数很容易找到并且似乎可以达到预期的效果。但是,我甚至无法编写一个简单的循环,它循环遍历无符号长整数范围内的所有2的幂。
int i = 0;
for(long l=1; (Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0) && i<100; l+=l) {
System.out.println(l);
i++;
}
产生输出
1
2
4
8
...
1152921504606846976
2305843009213693952
4611686018427387904
-9223372036854775808
0
0
0
...
0
我是否遗漏了这个简单任务仍需要的东西或外部库?
答案 0 :(得分:6)
如果您指的是
(Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0)
l
到达
-9223372036854775808
无符号它是
9223372036854775808
和
Long.MAX_VALUE*2
是
18446744073709551614
因此l
小于无符号世界中的Long.MAX_VALUE*2
。
假设你问的是0的
0
0
0
...
0
问题(如果你这样看)就是long
(其他数字基元),第一位是符号位。
所以
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
是
-9223372036854775808
当你这样做时
-9223372036854775808 + -9223372036854775808
你自下而上(溢出?)
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
+ 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
是
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
为0.在以后的循环迭代中,0 + 0
仍为0
。
答案 1 :(得分:4)
此处唯一的问题是您将l
打印为签名的整数。您可以使用Integer.toUnsignedString
来获得您期望的结果:
int i = 0;
byte[] tmp = new byte[9];
for(int l=1; (Long.compareUnsigned(l, Long.MAX_VALUE*2) < 0) && i<100; l+=l) {
System.out.println(Integer.toUsignedString(l)); // <== MODIFIED THIS LINE
i++;
}