在向上转换或转换Java时抑制符号扩展

Osc*_*orz 7 java

我有一种感觉,这是一个相当微不足道的问题,但我很难过.在我的应用程序中,我正在使用一对整数在查找表中键入内容.我认为将两个int连接成一个long更容易,而使用single long作为键.来自C背景,我希望这样的东西能起作用:

int a, b;
long l = (long)a << 32 | b;
Run Code Online (Sandbox Code Playgroud)

我试图用Java复制这个尝试让我感到沮丧.特别是,因为没有无符号整数类型,我似乎无法避免b的自动符号扩展(a左移以使其无关紧要).我尝试过使用,b & 0x00000000FFFFFFFF但令人惊讶的是没有效果.我也尝试过相当丑陋(long)b << 32 >> 32,但它似乎被编译器优化了.

我希望严格使用基元的位操作,但我开始怀疑是否需要使用某种缓冲对象来实现这一点.

maa*_*nus 17

我总是使用我的实用程序类

public static long compose(int hi, int lo) {
    return (((long) hi << 32) + unsigned(lo));
}
public static long unsigned(int x) {
    return x & 0xFFFFFFFFL;
}

public static int high(long x) {
    return (int) (x>>32);
}
public static int low(long x) {
    return (int) x;
}
Run Code Online (Sandbox Code Playgroud)

任何int x, y(否定的)

high(compose(x, y)) == x
low(compose(x, y)) == y
Run Code Online (Sandbox Code Playgroud)

持有并为任何人 long z

compose(high(z), low(z)) == z
Run Code Online (Sandbox Code Playgroud)

也持有.