更快的方法将数字从范围转换为另一个范围

Faster way to convert a number from range to another range

本文关键字:范围 转换 另一个 数字 方法      更新时间:2023-10-16

根据这样的问题,可以通过计算:

将数字范围转换为另一个(线性转换)

NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin

但是,我想知道是否还有另一个更快的做到这一点的方法。

考虑一个没有分裂指令的微控制器,将大量范围转换为另一个范围(即,从图像文件到LCD显示的24位颜色/像素从图像文件到18位颜色/像素)将需要某个时候。我在想有什么方法可以最佳。

24位颜色通常是8 x 3(3个组件,每位8位)。

18位颜色为6 x 3。

简单的>>2将8位值的范围转换为6位值,"舍入"。大多数硬件上的班次操作都很快。

四舍五入到最近的情况更困难,主要是因为溢出。与此相关:

(x+2)>>2

以16位值。结果是一个从0到2^6的值,而不是您想要的0至2^6-1。您必须检测到最后一个情况。

如果您负担得起ROM,则可以使用查找表。256条目并不多。如果您想应用伽马或其他更正,这可能更值得考虑。

但实际上,只有>>2和/或掩盖每个组件,然后将其移动并掩盖到位。

int32 r = ((pix>>2)&(0x3F<<0))|((pix>>4)&(0x3F<<6))|((pix>>6)&(0x3F<<12));

其中pix是32位值存储您的24位像素,R存储18位结果。

这种优化需要在尽可能接近真实环境的地方进行分析。