我有一个外部系统输出2个无符号整数,它们表示一个64位无符号int。 Java将它们拾取并将其转换为有符号整数。我在Java中称它们为上下。我想将其放回64位int。我知道我必须使用signed int。
我开始将它们都转换为长整数,将高位长整数移位32位,然后尝试将它们相加,但是效果并不理想,因为强制转换会移动整数的符号位。因此,我开始乱添加2 ^ 31和其他凌乱的内容。我怎样才能做到这一点?
这里是一个示例,为简单起见,使用2 x 8位数字到16位
Higher = 00000000 lower = 11111111
Desired result
0000000011111111
Result I get
1000000001111111
编辑:我认为这是可以的代码(我还没有完全测试过),但是我希望有一些更清洁的代码。
private static long combineCounters(int lower, int upper) {
long lower2 = (long)lower;
if(lower2 < 0) lower2 += (2L<<31);
long upper2 = (long)upper;
if(upper2 < 0) upper2 += (2L<<31);
long result = lower2 | (upper2<<32);
return result;
}
答案 0 :(得分:3)
int higher = ...
int lower = ...
long result = (((long) higher) << 32) | ((long) lower) & 0xFFFFFFFFL;
答案 1 :(得分:3)
对于您的情况,首先,应将整数值正确存储为long。为此,您可以将值与0xFFFFFFFFL(第一个32位为1的长整数)相加。
这是一个可行的示例:
int upperInt = ...
int lowerInt = ...
long hi = upperInt & 0xFFFFFFFFL;
long lo = lowerInt & 0xFFFFFFFFL;
long c = (hi << 32) | lo;
System.out.println(String.format("0x%X", c));