我有一组32位数据的样本集,格式为 24位2的补码,MSB在前。数据精度为18位;未使用的位为零。 我想处理此样本集中的数字以找到其平均值。
但是,我不确定如何将所有数字转换为相同类型,然后使用它们来计算平均值。
一种方法是将样本集中的所有数字向右移14。这种方式我直接获得18个有用的位(因为它是18位精度的24位数据,因此仅提取18个有用的位)。 然后,我可以直接使用这些数字来计算它们的平均值。
以下是数据样本的示例样本集:-
0xF9AFC000
0xF9AFC000
0xF9AE4000
0xF9AE0000
0xF9AE0000
0xF9AD0000
0xF9AC8000
0xF9AC8000
0xF9AC4000
0xF9AB4000
0xF9AB8000
0xF9AB4000
0xF9AA4000
0xF9AA8000
0xF9A98000
0xF9A8C000
0xF9A8C000
0xF9A8C000
0xF9A88000
0xF9A84000
但是,18位数字仍然具有符号位(MSB)。不一定总是设置该位,根据数据可能为0或1。
我应该通过将所有数字与0x1FFFF进行&运算来掩盖符号位,并将其用于计算平均值吗?
还是我应该先通过取反并加1将它们从2的补码转换为整数?
请建议从32位数字中提取和处理“ 24位2的补码,MSB优先”的正确方法。
谢谢!
答案 0 :(得分:0)
好吧,提供示例数据不是完整的规范,但让我们来看一下
F9AFC000
看起来数据是高位3个字节。那是个猜测。如果它们确实是2的补码的24位,那么将真实值放入32位int就是
int32_t get_value_from_datum(uint32_t datum) {
return (int32_t) datum >> 8;
}
在样本上,这将对前导F
的高位进行符号扩展。结果将为FFF9AFC0
。作为以10为底的2的补码整数,它是-413760
。
或者您的意思是感兴趣的18位在32位字中完全左对齐。然后是
int32_t get_value_from_datum(uint32_t datum) {
return (int32_t) datum >> 14;
}
结果为-6465。
正如我在评论中所说,您需要更清楚地说明数据格式。
最精确的规格最容易显示为32位字的图片,即MSB到LSB,它标识了哪18位是数据位。