2012-05-21 2 views
13

Как преобразовать два 32-битных целых числа (int) в один бит 64 бит long и наоборот?Преобразование long в два int и наоборот

+0

Каким способом вам нужно их преобразовать? Одна возможность: (a << Integer.SIZE) | b –

+0

Подписанный или неподписанный? Если без знака, то что означают отрицательные значения? –

+0

Возможный дубликат [Java хранения двух целых чисел в длинном] (https://stackoverflow.com/questions/12772939/java-storing-two-ints-in-a-long) – Vadzim

ответ

1

Ints к тоскует:

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

Я оставлю его в качестве упражнения для читателя, чтобы выполнить обратный расчет. Но это намек; используйте больше бит-сдвигов и bit-masks.

+0

Если это правильно работает с 'b <0 '? –

+0

@AleksG: Хорошая добыча! –

+0

Я думаю, что b вполне может считаться действительным, учитывая обстоятельства. – Tharwen

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

В Java вам не нужно столько скобок или любой маскировки при обратном вычислении.

+1

Арендатор: 'for (long i = Long.MIN_VALUE; i <= Long.MAX_VALUE; i ++) {...' –

+0

292 года намного меньше, чем потребуется. Мой компьютер также утверждает, что 292 года, как и все elses. Для меня '(stop-start) * 2.0/reps * Long.MAX_VALUE)' равно 1.207154932183553E22, а Long.MaxValue - 9223372036854775807, поэтому, когда приведение к '(длинному)' происходит, все заканчиваются 9223372036854775807. Поскольку это 1/1308-й, истинное значение времени должно составлять 382 000 лет. (Все еще +1, хотя с момента правильного ответа) –

+0

Ха-ха, очень хороший Ричард. У меня есть привычка никогда не делать преобразование millis-to-something-else вручную, но я также редко пытаюсь получить разрешение в миллисекундах на сотни (или сотни тысяч) лет. Поскольку я уже не учитель, я просто отредактирую весь бит упражнения. Ответ не должен быть таким долгим. – Fuwjax

Смежные вопросы