35

我想长期存储两个整数(而不是Point每次都创建一个新对象)。

目前,我试过这个。它不起作用,但我不知道它有什么问题:

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

我得到这样的 int 值:

x = (int) l >> 32;
y = (int) l & 0xffffffff;
4

3 回答 3

69

y在第一个片段中进行符号扩展,这将覆盖x为.-1y < 0

在第二个片段中,转换int为在班次之前完成,因此x实际上获得了 的值y

long l = (((long)x) << 32) | (y & 0xffffffffL);
int x = (int)(l >> 32);
int y = (int)l;
于 2012-10-07T21:22:23.377 回答
14

这是另一个使用字节缓冲区而不是按位运算符的选项。速度方面,它更慢,大约是速度的 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);
于 2014-08-06T22:03:40.753 回答
0

如果要将两个(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);
}
 
于 2020-12-28T18:15:18.460 回答