2012-10-07 15 views
24

Chcę przechowywać dwa ints w długim (zamiast konieczności tworzenia nowego obiektu Point za każdym razem).Java przechowywanie dwóch ints w długim

Obecnie próbowałem tego. To nie działa, ale nie wiem co jest nie tak:

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

A ja dostaję wartości int tak:

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

Odpowiedz

47

y jest coraz logowania rozszerzony w pierwszym fragment, który będzie nadpisywać x z -1 za każdym razem, gdy y < 0.

W drugim fragmencie obsada do int jest wykonywana przed zmianą, więc x faktycznie otrzymuje wartość y.

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

Ach, to ma sens. Mam jedno pytanie, czy ma to znaczenie, jeśli używasz bitmask używając długiego 0xffffffffL lub int 0xffffffff. – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofee Tak, to ma znaczenie, jeśli zamaskujesz '0xffffffff' (bez L), to jest to tylko int, więc' & 'jest bez op, a' y' * nadal dostaje znak rozszerzony *. – harold

+0

OK, dziękuję za wyjaśnienie! – LanguagesNamedAfterCofee

9

Oto kolejna opcja, która używa bufora bajtów zamiast operatorów bitowych. Prędkość jest wolniejsza, około 1/5 prędkości, ale znacznie łatwiej jest zobaczyć, co się dzieje:

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(1); 
Powiązane problemy