Java-将整数复制到long

时间:2018-11-30 06:10:46

标签: java

我有一个外部系统输出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;
 }

2 个答案:

答案 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));