更快的方法将数字从范围转换为另一个范围
Faster way to convert a number from range to another range
根据这样的问题,可以通过计算:
将数字范围转换为另一个(线性转换) 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位结果。
这种优化需要在尽可能接近真实环境的地方进行分析。
相关文章:
- 正在将指针转换为范围
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 字符串的矢量并使用 C++20 范围进行转换
- 如何使用按位运算将随机uint64_t转换为范围 (0, 1) 的随机双精度
- 正在尝试确定转换后的范围是否为空
- 从转换后的范围构建新容器
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- std::vector 范围构造函数可以调用显式转换吗?
- 标准是否阻止在可变参数模板中使用足够小的文本值缩小文本转换范围
- 使用范围 v3 进行转换
- 从'::size_t'转换为'int'需要缩小转换范围
- C++ 提升范围:any_range和转换适配器
- 列表初始化时需要缩小转换范围
- C 范围V3:试图将链条链在一起转换
- 是否有范围::视图::转换的可修改视图版本
- 使用 atan2 将范围从 - 1 到 1 转换为度
- 从'double'转换为'int'需要缩小转换范围
- 正在缩小MSVC中到布尔警告的转换范围
- 更快的方法将数字从范围转换为另一个范围
- 使用boost范围转换适配器具有二进制功能