我希望在一个long中存储两个int(而不是每次都必须创建一个新的Point
对象。)
目前,我试过这个。它不起作用,但我不知道它有什么问题:
// x and y are ints
long l = x;
l = (l << 32) | y;
我得到的int值如下:
x = (int) l >> 32;
y = (int) l & 0xffffffff;
答案 0 :(得分:51)
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 :(得分:11)
这是另一个使用bytebuffer而不是按位运算符的选项。速度方面,速度较慢,约为速度的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);
答案 2 :(得分:0)
如果要将两个 Float 值(32 位)存储为单个 Long 值(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);
}