Получая биты int в длинный - PullRequest
1 голос
/ 25 января 2012

Я создаю легкую высокоточную арифметическую библиотеку для одного из моих Java-приложений, и я немного разбираюсь в ней (игра слов предназначена). Иногда я получаю int, который необходимо преобразовать в long с помощью простого расширения слова, т. Е. 32 младших значащих бита long должны стать равными битам int.

К сожалению, приведение работает правильно только для положительных чисел. Кроме того, использование int в том же арифметическом выражении с long неявно приведёт к long заранее, что означает, например, это не будет работать, если i отрицательно:

long l = (i & 0xffffffffL);

В настоящее время я использую что-то вроде:

long l = (((long)(i >>> 8)) << 8) | (i & 0xff);

Есть ли более элегантный способ сделать это?

EDIT:

Я могу что-то упустить:

int i = -1;

long l = (i | 0xffffffffL);

System.out.println(l);

Это печатает -1 вместо 4294967295. Что мне не хватает?

РЕДАКТИРОВАТЬ 2:

Упс ... | вместо &. Как ************** там?

РЕДАКТИРОВАТЬ 3:

У меня нет представления о том, как именно я это пропустил, но это прекрасно работает:

long l = (i & 0xffffffffL);

... что делает этот вопрос совершенно неактуальным, я думаю.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Вы действительно тестировали код long l = (i & 0xffffffffL);?Да, значение i будет сначала преобразовано в long, что означает либо 0-расширение, если i положительно, либо 1-расширение, если i отрицательно.В любом случае младшие 32 бита не затрагиваются, поэтому, если я не пойму проблему неправильно, операция & должна оставить вас с желаемым результатом.

1 голос
/ 25 января 2012

Вы написали long l = (i | 0xffffffffL); во втором примере.

Должно быть:

long l = (i & 0xffffffffL);

и тогда вы получите ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...