Java将两个整数存储在一个长整型变量中

38

我想在一个长整型变量中存储两个整数(而不必每次创建一个新的 Point 对象)。

目前,我尝试过下面的方法。它并没有起作用,但我不知道哪里出了问题:

// x and y are ints
long l = x;
l = (l << 32) | y;

我是这样获取整数值的:

x = (int) l >> 32;
y = (int) l & 0xffffffff;
3个回答

75

在第一个代码片段中,y 被符号扩展了,这会导致当 y < 0 时,x 会被覆盖为 -1

而在第二个代码片段中,在移位之前将 y 强制转换为 int,所以 x 实际上获得了 y 的值。

long l = (((long)x) << 32) | (y & 0xffffffffL);
int x = (int)(l >> 32);
int y = (int)l;

啊,这有道理。我有一个问题是,如果你使用长整型0xffffffffL或整型0xffffffff作为掩码,是否会有影响? - LanguagesNamedAfterCofee
2
@LanguagesNamedAfterCofee 是的,它很重要。如果你用 0xffffffff(没有 L)掩码,那么它只是一个 int 类型,所以 & 是无操作符, y 仍然会得到符号扩展。 - harold

14

这里还有一种选项,使用ByteBuffer而不是位运算符。速度上比位运算慢,大约只有五分之一的速度,但更容易看清楚发生了什么:

long l = ByteBuffer.allocate(8).putInt(x).putInt(y).getLong(0);
//
ByteBuffer buffer = ByteBuffer.allocate(8).putLong(l);
x = buffer.getInt(0);
y = buffer.getInt(4);

3
Java 8中有Long.BYTES,比神秘数字8更清晰。 - Maarten Bodewes
1
y = buffer.getInt(4); - 参数是字节偏移量,所以为4。 - Luke

-1

如果要将两个 32 位的浮点数作为单个 64 位的 Long 值存储,可以将浮点数的位转换为整数值的位,然后转换为与之前答案相同的位。

// first method using floatToIntBits 
long method1(float x, float y) {

    int xInt = java.lang.Float.floatToIntBits(x);
    int yInt = java.lang.Float.floatToIntBits(y);
    
    return (((long)xInt) << 32) | (yInt & 0xffffffffL);
}

// second method using ByteBuffer
long method2(float x, float y) {
    return ByteBuffer.allocate(java.lang.Long.BYTES).putFloat(x).putFloat(y).getLong(0);
}
 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接