2012-10-07 78 views
24

Quiero almacenar dos entradas en un largo (en lugar de tener que crear un nuevo objeto Point cada vez).Java almacenando dos entradas en un largo

Actualmente, probé esto. No está funcionando, pero no sé lo que está mal con él:

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

y me estoy poniendo los valores int modo:

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

Respuesta

47

y es cada vez extendido a firmar en el primer snippet, que sobrescribiría x con -1 cada vez que y < 0.

En el segundo fragmento, el lanzamiento a int se realiza antes del cambio, por lo que x realmente obtiene el valor de y.

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

Ah, eso tiene sentido. Una pregunta que tengo es si importa si se usa la máscara de bits usando el largo 0xffffffffL o el int 0xffffffff. – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofee sí, si se enmascara con '0xffffffff' (sin la L), entonces es solo un int, por lo que' y 'es un no-funcionamiento y' y' * todavía obtiene el signo extendido *. – harold

+0

Bien, gracias por la explicación! – LanguagesNamedAfterCofee

9

Aquí hay otra opción que utiliza un bytebuffer en lugar de operadores bit a bit. En cuanto a la velocidad, es más lento, alrededor de 1/5 de la velocidad, pero es mucho más fácil ver lo que está sucediendo:

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