Search code examples
javabit-manipulationprimitive

Java storing two ints in a long


I want to store two ints in a long (instead of having to create a new Point object every time).

Currently, I tried this. It's not working, but I don't know what is wrong with it:

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

And I'm getting the int values like so:

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

Solution

  • y is getting sign-extended in the first snippet, which would overwrite x with -1 whenever y < 0.

    In the second snippet, the cast to int is done before the shift, so x actually gets the value of y.

    long l = (((long)x) << 32) | (y & 0xffffffffL);
    int x = (int)(l >> 32);
    int y = (int)l;