Конвертировать 32-битные данные в беззнаковое длинное значение
У меня есть что-то вроде этого:
int[0] = 4123;
int[1] = 2571;
Я хотел бы объединить их и сделать одно длинное значение в Java. Это моя попытка:
int[] r = { 4123, 2571 };
long result = ( (r[1] & 0xFFFF) << 16 | (rs[0] & 0xFFFF) );
System.out.prinln(result);
Вывод должен быть: 10111627, но я получаю 168497179. Возможно, я что-то упускаю в конвертации, но не знаю, что...
РЕДАКТИРОВАТЬ
Это пример того, как значение помещается в 32-битный регистр.
1 ответ
Я пытаюсь подвести итог и, надеюсь, уточнить, что уже указывают несколько комментариев по вашему вопросу:
Если вы хотите получить номер с вашего изображения, который 00001010 00001011 00010000 00011011
знак равно 0x0A0B101B
знак равно 168497179
в одном long
значение и у вас есть два целых 0001000000011011
знак равно 0x101B
знак равно 4123
а также 0000101000001011
знак равно 0x0A0B
знак равно 2571
чем ваш код правильный.
Я бы порекомендовал вам привыкнуть к шестнадцатеричным числам, так как они легко показывают, что нет двоичной связи между 0x0A0B
& 0x101B
а также 0x009A4A8B
знак равно 10111627
,
Кстати, ваше изображение противоречиво: двоичные числа представляют, как видно выше числа 0x0A0B101B
но шестнадцатеричные читать 0x0A0B101E
(обратите внимание на E
) в то время как десятичные дроби поддерживают двоичное значение.
Наконец-то я разобрался с твоим недостатком:
Вы, кажется, ожидаете получить десятичное число, объединенное вместе в результате. Но в отличие от шестнадцатеричных здесь это не работает в десятичном виде!
Позвольте мне уточнить это. У вас есть двоичное число: 00001010 00001011 00010000 00011011
Который вы можете легко конвертировать в шестнадцатеричный блок за блоком 0x0A 0x0B 0x10 0x1B
и чем просто присоединиться к ним вместе 0x0A0B101B
Но это волшебное соединение - это просто упрощение, применимое только к гексам (и причина, по которой гекс так популярен среди программистов).
Длинная версия состоит в том, что вы должны умножить старшие блоки / байты (слева) на "основание" предыдущего блока (справа). Самый правый блок всегда умножается на 1
, База для следующего блока есть (так как есть 8
биты в первом блоке) 2 8 = 256
знак равно 0x100
, База для третьего блока есть (8+8
биты) 2 16 = 65536
знак равно 0x10000
, Последний (самый левый) должен быть умножен на (8+8+8
биты) 2 24 = 16777216
знак равно 0x1000000
,
Давайте сделаем пример для первых двух блоков:
Hexadecimal: 0x10
|| 0x1B
(0x10 * 0x100) + (0x1B* 0x1)
0x1000 + 0x1B
знак равно 0x101B
Десятичный: 16
|| 27
(16 * 256) + (27 * 1)
4096 + 27
знак равно 4123
Как вы можете видеть на своем изображении, они оба в нем (обратите внимание на E
/ B
вопрос, который находится в десятичной 6
/ 3
вопрос) но нет 1627
, Таким образом, преобразование двоичных или шестнадцатеричных чисел в десятичное является нетривиальной задачей (для людей), лучше всего использовать калькулятор.