我需要在c中从定点带符号的Q8 format转换成定点带符号的Q4 format,假设我可以做一个四位移位,对吗?我需要考虑符号位吗?
更新:这是针对ARM11架构的,但我更喜欢非架构特定的解决方案。
谢谢
发布于 2010-10-05 22:44:05
位移位应该可以工作,并且还可以处理许多架构上的符号位。在负数的情况下,更多的1将被移入,但您将只使用较低的5位,或者在C中进行算术,其中您需要这些额外的位来形成正确的二进制补码。
假设是整型数,那么代码将会是:
int q4 = q8 >> 4;也许你想转一转:
int ahalf = q8 >= 0 ? (1<<3) : (1<<3)-1;
int q4 = (q8+ahalf) >> 4;好的,我听了Oli的话,并提出了一个解决方案,用于解决不能正确移动符号的架构:
int q4 = q8 / (1<<4);如果可能,优化器应该将除法转换为移位。
对于四舍五入,第一个解决方案是
int ahalf = q8 >= 0 ? (1<<3) : -(1<<3);
int q4 = (q8+ahalf) / (1<<4);由于R..的持久性,我最终测试了所有版本,它们现在在Linux下使用Intel 32位有符号整数产生了正确的结果。
发布于 2010-10-05 22:49:08
我知道C的右移行为是由实现定义的。请参阅标准的6.5.7/5
(一些计算机可能会复制MSB,如下图所示;其他计算机可能会添加'0')

关注符号位看起来不像是一件很大的工作。
但是,如果您的代码将仅在同一台机器上编译,那么您可以检查该机器的实现,并忽略符号位(如果它“有效”)。
https://stackoverflow.com/questions/3864515
复制相似问题