Подтвердить что ты не робот

Java хранит два ints в длинном

Я хочу сохранить два ints в long (вместо того, чтобы каждый раз создавать новый объект Point).

В настоящее время я попробовал это. Он не работает, но я не знаю, что с ним не так:

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

И я получаю значения int так:

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

Ответ 1

y получает расширенный знак в первом фрагменте, который будет перезаписывать x с помощью -1 всякий раз, когда y < 0.

Во втором фрагменте приведение к int выполняется перед сдвигом, поэтому x фактически получает значение y.

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

Ответ 2

Вот еще один вариант, который использует байтовый буфер вместо побитовых операторов. По скорости это медленнее, примерно на 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);