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;
Ответы
Ответ 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);