定点有符号 Q8 到 Q4 格式的转换

发布于 2024-09-26 19:57:00 字数 286 浏览 5 评论 0原文

我需要从定点签名 Q8 格式 转换为定点签名 Q4 格式 in c.我假设我只能进行四位移位,这是正确的吗?我需要考虑符号位吗?

更新:这是针对 ARM11 架构的,但我更喜欢非特定于架构的解决方案。

谢谢

I need to convert from fixed point signed Q8 format to fixed point signed Q4 format in c. I assume that I can just do a bitshift by four, is this correct? Do I need to take into account the sign bit?

Update: This is for an ARM11 architecture, but I would prefer a non-architecture specific solution.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野却迷人 2024-10-03 19:57:00

位移位应该可以工作,并且还可以处理许多架构上的符号位。如果是负数,更多的数将被移入,但您要么只使用较低的 5 位,要么在需要这些额外的数以形成正确的二进制补码的情况下在 C 中进行算术运算。

假设是整数,代码将很简单:

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.. 的坚持,我终于测试了所有版本,现在它们在 Linux 下使用 Intel 32 位有符号整数产生了正确的结果。

A bitshift should work and will also take care of the sign bit on many architectures. In case of negative numbers, more ones will be shifted in but you will either only use the lower 5 Bits or do arithmetic in C where you need these additional ones to form the correct twos complement.

Assuming ints, the code would simply be:

int q4 = q8 >> 4;

Perhaps you would like to round:

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

Ok, I listen to Oli and present a solution for architectures that do not shift sign-correct:

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

The optimizer should convert the division to a shift if possible.

With rounding, a first solution is

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

Thanks to R..'s persistence I finally tested all versions and they now produce the correct results with Intel 32 Bit signed integers under Linux.

天赋异禀 2024-10-03 19:57:00

我知道 C 的右移行为是实现定义的。请参阅标准的 6.5.7/5

(某些计算机可能会复制 MSB,如下图所示;其他计算机可能会添加“0”)

关心符号位看起来并不需要很多工作。

但是,如果您的代码仅在同一台机器上编译,您可以检查该机器实现并忽略符号位(如果它“有效”)

I know C`s right shift behaviour is implementation defined. See 6.5.7/5 of the Standard

(some computers might copy the MSB as in the image below; others might add a '0')

It doesn't look like a lot of work to care about the sign bit.

But if your code is going to be compiled only on the same machine, you can check that machine implementation and ignore the sign bit if it "works"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文