根据this SO question,可以通过计算将数字范围转换为另一个(线性转换):
NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
但是,我想知道是否还有其他更快的方式来执行此操作。
考虑一个没有分割指令的微控制器,将大量的范围转换为另一个范围(即从图像文件到LCD显示器的24位颜色/像素到18位颜色/像素)需要一段时间。我在想是否有办法优化这一点。
答案 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位结果。
这种优化需要在尽可能接近真实环境的情况下进行分析。