【发布时间】:2017-01-03 20:56:33
【问题描述】:
根据this SO question,可以通过计算将一个数字范围转换为另一个(线性转换):
NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
但是,我想知道是否还有其他更快的方法可以做到这一点。
考虑一个没有除法指令的微控制器,将大量范围转换为另一个范围(即,将图像文件中的 24 位颜色/像素转换为 LCD 显示器的 18 位颜色/像素)需要一些时间。我在想有什么办法可以优化这个。
【问题讨论】:
-
这里整数除法的唯一替代方法是浮点乘法。无论你转向哪种方式,你都无法改变基础数学的规则。
-
我可以想象浮点运算在这些设备上会更慢。
-
您给定的将范围 (0,2^24-1) 转换为 (0,2^18-1) 的示例可以通过位移来完成(如果您想四舍五入,还可以加一个到最近)
-
@KongChunHo
NewValue = OldValue >> 6将删除 6 个最低有效位。确保您的值是unsigned。 -
@SamVarshavchik:永远不要说“唯一”。在这种特殊情况下,一个简单的转变很可能就可以了。在其他情况下,定点会更好。
标签: c++ c performance math optimization