Хранение беззнакового длинного значения в двух 16-битных регистрах
Я хочу хранить беззнаковое длинное значение в двух 16-битных регистрах. Например, если у меня длинное значение (-2,147,483,648 to 2,147,483,647)
тогда я использую формулу как:
v[0] = myValue % 65536
v[1] = myValue / 65536
Получить значение из реестра
outVal = reg0 + (reg1 * 65536)
Но как сделать для unsigned long диапазон значений от 0 to 4,294,967,295?
1 ответ
Как уже отметил комментатор Гарольд, ваша формула даже не работает правильно для отрицательных чисел.
Вы должны делать это побитно вместо математики, чтобы избежать неожиданностей (и ускорить процесс, если компилятор уже не оптимизировал его для вас).
Расщепление:
v[0] = myValue & 0xFFFF
v[1] = myValue >> 16 // this implicitly cuts off the lower 16 bits
// by shifting them away into the nirvana
Присоединение:
outVal = reg0 | (reg1 << 16)
Теперь это относится как к знаку, так и к знаку без знака (при условии, что все ваши переменные имеют одинаковый "тип знака").
Легенда, если ваш язык (который вы не указали) использует разные операторы:
&
побитовое И, |
побитовое ИЛИ, <<
а также >>
сдвигаются влево / вправо (SHL/SHR), 0x
отмечает шестнадцатеричный литерал (вы можете использовать 65536
вместо 0xFFFF
, но я думаю, что шестнадцатеричный литерал проясняет, откуда происходит это магическое число).