2012-05-21 15 views
13

Jak przekonwertować dwie 32-bitowe liczby całkowite (int) na jedną 64-bitową long i na odwrót?Konwertuj z długiej na dwie wartości int i na odwrót

+0

W jaki sposób chcesz je przekonwertować? Jedna z możliwości: (a << Integer.SIZE) | b –

+0

Podpisano lub podpisano? Jeśli bez znaku, to co oznaczałoby wartości ujemne? –

+0

Prawdopodobny duplikat [Java przechowujący dwa ints w długim] (https://stackoverflow.com/questions/12772939/java-storing-two-ints-in-a-long) – Vadzim

Odpowiedz

1

Ints do tęskni:

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

Zostawiam to jako ćwiczenie dla czytelnika do wykonania odwrotnego obliczenia. Ale wskazówka jest; użyj więcej przesunięć bitowych i bit-masks.

+0

Czy to działa poprawnie z 'b <0 '? –

+0

@AleksG: Dobry haczyk! –

+0

Myślę, że b może już być uznane za ważne, biorąc pod uwagę okoliczności. – Tharwen

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

W języku Java nie trzeba mieć aż tylu nawiasów ani żadnego maskowania na odwrotnej kalkulacji.

+1

Najemca: 'dla (długi i = długi.MIN_VALUE; i <= długi.MAX_VALUE; i ++) {...' –

+0

292 lata to o wiele mniej, niż zajmie to. Mój komputer również roszczą sobie 292 lata, podobnie jak wszyscy inni. Dla mnie '(stop - start) * 2.0/reps * Long.MAX_VALUE)' to 1.207154932183553E22, natomiast Long.MaxValue to 9223372036854775807, więc gdy rzutowanie na '(długie)' zdarza się, każdy kończy na 9223372036854775807. Jako że jest to 1/1308 prawdziwa wartość, czas powinien wynosić 382 000 lat. (Nadal +1, ale ponieważ aktualna odpowiedź jest poprawna) –

+0

Haha, bardzo miły Richard. Mam zwyczaj nigdy nie wykonywać ręcznie konwersji milis-to-something-else, ale rzadko staram się uzyskać milisekundową rozdzielczość na setki (lub setki tysięcy) lat. Ponieważ nie jestem już nauczycielem, po prostu edytuję cały "ćwiczeniowy" bit. Odpowiedź nie musi być tak długa. – Fuwjax

Powiązane problemy