Я создаю легкую высокоточную арифметическую библиотеку для одного из моих 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);
... что делает этот вопрос совершенно неактуальным, я думаю.