2012-10-07 5 views
24

Voglio memorizzare due interi in un lungo (invece di dover creare un nuovo oggetto Point ogni volta).Java che memorizza due interi in un lungo

Attualmente, ho provato questo. Non funziona, ma non so che cosa è sbagliato con esso:

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

e sto ottenendo i valori int in questo modo:

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

risposta

47

y sta ottenendo accesso esteso nel primo snippet, che sovrascriverebbe x con -1 ogni volta che y < 0.

Nel secondo frammento, il cast a int viene eseguito prima del turno, quindi x ottiene effettivamente il valore di .

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

Ah, questo ha senso. Una domanda che ho è se è importante se si maschera il bit utilizzando il 0xffffffffL lungo o il 0xffffffff int. – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofee yes è importante, se si maschera con '0xffffffff' (senza la L), allora è solo un int, quindi' &' è un no-op e 'y' * ottiene ancora il segno esteso *. – harold

+0

Ok, grazie per la spiegazione! – LanguagesNamedAfterCofee

9

Questa è un'altra opzione che utilizza un bytebuffer invece di operatori bit a bit. In termini di velocità, è più lento, circa 1/5 della velocità, ma è molto più facile vedere cosa sta succedendo:

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);