Преобразование фиксированной точки со знаком Q8 в формат Q4 - PullRequest
1 голос
/ 05 октября 2010

Мне нужно преобразовать из фиксированной точки со знаком Q8 формат в фиксированную точку со знаком Q4 формат в c.Я предполагаю, что я могу просто сделать сдвиг на четыре, это правильно?Нужно ли учитывать бит знака?

Обновление: это для архитектуры ARM11, но я бы предпочел решение, не относящееся к архитектуре.

Спасибо

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Сдвиг битов должен работать, а также будет заботиться о знаковых битах на многих архитектурах. В случае отрицательных чисел, большее число будет сдвинуто, но вы будете либо использовать только младшие 5 битов, либо выполнять арифметику в Си, где вам нужны эти дополнительные, чтобы сформировать правильное дополнение к двум.

Принимая целые числа, код будет просто:

int q4 = q8 >> 4;

Возможно, вы хотели бы округлить:

int ahalf = q8 >= 0 ? (1<<3) : (1<<3)-1;
int q4 = (q8+ahalf) >> 4;

Хорошо, я слушаю Оли и представляю решение для архитектур, которые не меняют знак-правильность:

int q4 = q8 / (1<<4);

Оптимизатор должен преобразовать деление в сдвиг, если это возможно.

При округлении первое решение будет

int ahalf = q8 >= 0 ? (1<<3) : -(1<<3);
int q4 = (q8+ahalf) / (1<<4);

Благодаря настойчивости R .. я наконец протестировал все версии, и теперь они дают правильные результаты с 32-битными целыми числами, подписанными Intel, под Linux.

0 голосов
/ 05 октября 2010

Я знаю, что правое смещение C зависит от реализации. См. 6.5.7 / 5 стандарта

(некоторые компьютеры могут копировать MSB, как показано на рисунке ниже; другие могут добавлять '0')

image

Не похоже на большую работу, чтобы заботиться о знаке.

Но если ваш код будет скомпилирован только на той же машине, вы можете проверить реализацию этой машины и проигнорировать знаковый бит, если он "работает"

...