Java存储两个整数

时间:2012-10-07 21:17:13

标签: java bit-manipulation primitive

我希望在一个long中存储两个int(而不是每次都必须创建一个新的Point对象。)

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

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

我得到的int值如下:

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

3 个答案:

答案 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);
}