2014-01-19 4 views
3

Мне нужно преобразовать 8-битное число (0 - 255 или # 0 - #FF) в его 12-битный эквивалент (0 - 4095 или # 0 - #FFF)Преобразование 8 бит в масштабированный эквивалент 12 бит

Я не хочу делать прямое преобразование того же числа. Я хочу представить один и тот же масштаб, но в 12 бит.

Например: -

0xFF в 8 бит следует преобразовать в 0xFFF в 12 бит

0x0 в 8 бит должен преобразовать в 0x0 в 12 бит

0x7F в 8 бит должен преобразовать чтобы 0x7FF в 12 бит

0x24 в 8 бит должен преобразовать в 0x249 в 12 бит

Существуют ли какие-либо конкретные алгоритмы или методы, которые я должен использовать?

Я кодирования в C

+1

Можете ли вы приблизительный сдвиг влево и/или вычитание 1 (или добавления)? Как 110 в 3 бит до 1100 в 4 бит, которые от 6 до 12 для максимумов от 7 до 15 (14 путем вычитания). –

+0

Я мог бы просто отделаться от этого .... Я заметил, что это может быть решением, поскольку я выполнял вышеприведенные вычисления. Эти значения будут использоваться для управления светодиодным освещением, поэтому полная точность не является очень важной. Мне нужно будет проверить, не изменилось ли это, поэтому мне интересно узнать, есть ли другие способы решения этой задачи. – Remixed123

+1

В этом случае сдвиг влево на 4 звучит как самый быстрый и простой подход. Это приведет к неточности около 1%, что вряд ли будет заметным. –

ответ

6

Попробуйте x << 4 | x >> 4.

Это был обновлен ОП, изменяется от й < < 4 + х >> 4

+0

+1, просто репликация наиболее значимых бит 8-битного числа в младшие 4 бита 12-битного числа дает результаты, которые обычно очень близки к решению с использованием деления. И он обрабатывает все угловые случаи для 0 и 0xff. –

3

Если вы в состоянии пройти через большую область, то это может помочь:

b = a * ((1 << 12) - 1)/((1 << 8) - 1) 

Это является уродливым, но сохраняет масштабирование почти в соответствии с запросом. Конечно, вы можете поставить константы.

Смежные вопросы