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;
Advertisement
Answer
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;