我想长期存储两个整数(而不是Point
每次都创建一个新对象)。
目前,我试过这个。它不起作用,但我不知道它有什么问题:
// x and y are ints
long l = x;
l = (l << 32) | y;
我得到这样的 int 值:
x = (int) l >> 32;
y = (int) l & 0xffffffff;
我想长期存储两个整数(而不是Point
每次都创建一个新对象)。
目前,我试过这个。它不起作用,但我不知道它有什么问题:
// x and y are ints
long l = x;
l = (l << 32) | y;
我得到这样的 int 值:
x = (int) l >> 32;
y = (int) l & 0xffffffff;
y
在第一个片段中进行符号扩展,这将覆盖x
为.-1
y < 0
在第二个片段中,转换int
为在班次之前完成,因此x
实际上获得了 的值y
。
long l = (((long)x) << 32) | (y & 0xffffffffL);
int x = (int)(l >> 32);
int y = (int)l;
这是另一个使用字节缓冲区而不是按位运算符的选项。速度方面,它更慢,大约是速度的 1/5,但更容易看到发生了什么:
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);
如果要将两个(32 位)浮点值存储为单个长整型值(64 位)。您可以将浮点值的位转换为整数值的位,然后转换为与前面的答案相同。
// 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);
}