更快速地将数字从范围转换为另一个范围

时间:2017-01-02 03:03:01

标签: c++ c performance math optimization

根据this SO question,可以通过计算将数字范围转换为另一个(线性转换):

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

但是,我想知道是否还有其他更快的方式来执行此操作。

考虑一个没有分割指令的微控制器,将大量的范围转换为另一个范围(即从图像文件到LCD显示器的24位颜色/像素到18位颜色/像素)需要一段时间。我在想是否有办法优化这一点。

1 个答案:

答案 0 :(得分:4)

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是存储24位像素的32位值,r存储18位结果。

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