Я пытаюсь решить загадку в тесте программирования.Извлечение чисел из 32-разрядного целого
Отказ от ответственности: Это тест на работу, но я не ищу ответа. Я просто ищу понимание того, как это сделать. Тест требует, чтобы я придумал набор решений для решения проблем в течение 2 недель, и в нем не указано, что я прихожу к решениям изолированно.
Итак, проблема:
У меня есть 32-битное число с битами расположены так:
siiiiiii iiiiiiii ifffffff ffffffff
Где:
- s является знаковый бит (1 = = отрицательный)
- i - 16 целых битов
- f - 15 бит фракции
Назначение - записать что-то, что декодирует 32-разрядное целое число в число с плавающей запятой. Учитывая следующие входы, он должен производить следующие результаты:
input output
0x00008000 1.0
0x80008000 -1.0
0x00010000 2.0
0x80014000 -2.5
0x000191eb 3.14
0x00327eb8 100.99
Я не имею никаких проблем получать знаковый бит или целую часть числа. Я получаю знаковый бит, как это:
boolean signed = ((value & (1 << 31)) != 0);
Я получаю целую и дробную часть, как это:
int wholePart = ((value & 0x0FFFFFFF) >> 15);
int fractionPart = ((value & 0x0000FFFF >> 1));
Часть У меня проблема с получают число в последних 15 бит для соответствия ожидаемым значениям. Вместо 3.14 я получаю 3.4587 и т. Д.
Если кто-то может дать мне подсказку о том, что я делаю неправильно, я был бы признателен. Больше всего на свете тот факт, что я не понял этого после нескольких часов беспорядка с ним, отчасти сводит меня с ума. :-)
У вас возникла проблема с маской целиком, что тестовые данные не будут повторяться телятина. Двойные скобки в выражении fractionPart не совпадают с круглыми скобками в выражении wholePart; но я не вижу причины сдвинуть дробь в любом случае. Маска фракции также ошибочна. –