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

Другие вопросы по тегам