我有一个32位数据的样本集,格式为24位,2的补码,MSB在前。数据精度为18位;未使用的位为零。
我想处理此样本集中的数字以找到其平均值。

但是,我不确定如何将所有数字转换为相同的类型,然后使用它们来计算平均值。

一种方法是将样本集中的所有数字右移14位。这种方式我直接获得18个有用位(因为它是24位数据,精度为18位,因此仅提取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优先”数字的正确方法。

提前致谢!

最佳答案

好吧,提供样本数据并不是一个完整的规范,但让我们看一下

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位是数据位。

10-07 19:40
查看更多