2012-05-21 18 views
13

¿Cómo puedo convertir dos enteros de 32 bits (int) en un 64 bit long y viceversa?Convierte long to two int y viceversa

+0

¿De qué manera desea convertirlos? Una posibilidad: (a << Integer.SIZE) | b –

+0

¿Firmado o sin firmar? Si no está firmado, ¿qué significan los valores negativos? –

+0

Posible duplicado de [Java almacenando dos ints en un largo] (https://stackoverflow.com/questions/12772939/java-storing-two-ints-in-a-long) – Vadzim

Respuesta

1

Entrs a anhela:

long c = ((long)a << 32) | ((long)b & 0xFFFFFFFL); 

lo dejo como ejercicio para el lector para realizar el cálculo inverso. Pero la pista es; use más cambios de bit y bit-masks.

+0

¿Podría funcionar correctamente con 'b <0 ¿? –

+0

@AleksG: ¡Buena captura! –

+0

Creo que se puede suponer ya que es válido, dadas las circunstancias. – Tharwen

32
long c = (long)a << 32 | b & 0xFFFFFFFFL; 
int aBack = (int)(c >> 32); 
int bBack = (int)c; 

En Java, no es necesario bastante tantos paréntesis, o cualquier enmascaramiento en el cálculo inverso.

+1

Arrendatario: 'for (long i = Long.MIN_VALUE; i <= Long.MAX_VALUE; i ++) {...' –

+0

292 años es mucho menos de lo que tomará. Mi computadora también dice 292 años, como todos los demás. Para mí '(stop - start) * 2.0/reps * Long.MAX_VALUE)' es 1.207154932183553E22, mientras que Long.MaxValue es 9223372036854775807, por lo que cuando el lanzamiento a '(largo)' ocurre, todos terminan con 9223372036854775807. Como eso es 1/1308 verdadero valor, el tiempo debería ser de 382,000 años. (Todavía +1, ya que la respuesta real es correcta) –

+0

Jaja, muy agradable Richard. Tengo la costumbre de nunca hacer la conversión millis-to-something-else de forma manual, pero tampoco trato de obtener una resolución de milisegundos en cientos (o cientos de miles) de años. Como ya no soy un maestro, voy a editar todo el bit del "ejercicio". La respuesta no necesita ser tan larga. – Fuwjax