如何将数据从Q33.31格式转换为Q2.30格式?我知道,如果输入和输出的位大小相同,则需要使用移位运算符。但是如何计算它们的大小是否不同?
怎么样:
uint32_t convert(uint64_t x)
{
uint32_t hi = (uint32_t)(x >> 32);
uint32_t lo = (uint32_t)(x);
if (hi >= (1 << 2) || lo >= (1 << 30))
// handle input-too-large-or-too-accurate error and exit
return (hi << 30) | lo;
}
或者,处理if
语句中的错误输入(如果您不关心可能的信息丢失,则可以简单地单击return (hi << 30) | ((lo << 2) >> 2);
。
在对@goodvibration答案的评论中,您声明要添加两个Q1.31数字。鉴于此,您知道结果可以表示为Q2.31,因此要将Q2.31数转换为Q2.30,只需将结果右移一位:
uint32_t convert_q231_q230(uint64_t x)
{
return (uint32_t) (x >> 1);
}