我需要在c中从定点有符号Q8 format转换到定点有符号Q4 format。我假设我可以只做4位移位,对吗?我需要考虑标志位吗?
更新:这是一个ARM11架构,但我更喜欢一个非架构特定的解决方案。
谢谢
最佳答案
一个位转换应该可以工作,并且在许多架构上也会处理符号位。在负数的情况下,更多的数字将被移入,但是你要么只使用较低的5位,要么在需要这些额外的数字来形成正确的2补码的地方用C做算术。
假设是int,那么代码将是:
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位有符号整数产生了正确的结果。