我想在一个长整型变量中存储两个整数(而不必每次创建一个新的 Point
对象)。
目前,我尝试过下面的方法。它并没有起作用,但我不知道哪里出了问题:
// x and y are ints
long l = x;
l = (l << 32) | y;
我是这样获取整数值的:
x = (int) l >> 32;
y = (int) l & 0xffffffff;
我想在一个长整型变量中存储两个整数(而不必每次创建一个新的 Point
对象)。
目前,我尝试过下面的方法。它并没有起作用,但我不知道哪里出了问题:
// x and y are ints
long l = x;
l = (l << 32) | y;
我是这样获取整数值的:
x = (int) l >> 32;
y = (int) l & 0xffffffff;
在第一个代码片段中,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;
这里还有一种选项,使用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);
Long.BYTES
,比神秘数字8更清晰。 - Maarten Bodewes如果要将两个 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);
}
0xffffffff
(没有 L)掩码,那么它只是一个 int 类型,所以&
是无操作符,y
仍然会得到符号扩展。 - harold