【发布时间】:2014-10-09 20:51:12
【问题描述】:
我想知道如何将一个浮动变量“增益”值(十进制 0.0 - 1.0)乘以一个变量 4 位离散值(16 个离散级别),最终得到一个缩放值,所有这些都通过不使用浮动点数学/数字(最好使用按位运算等)。我正在用 C(XC16 编译器)编写一个 PIC 16 位微控制器来控制一个多色 LED 阵列。每个 LED 可呈现 16 级强度。 P 是该瞬间的原始 LED“图案”强度。 C 是应用于 P 的图案比例值。S 是最终缩放的图案值。
例如,我有一个值 P = 0x0F,我想缩放到其原始值的 50%(即乘以 C = 0.50),最终得到 'S' = 0x08(向上舍入);或 P = 0x00:0x0F 和 C = 0.0:1.0 的任何组合。结果“S”最终应该是一个 4 位数字(16 个离散值,0x00 到 0x0F),但根据“C”缩放原始值的 0-100%。显然,必须采用一些天花板/地板/圆角方法,以及一些类型的铸造。
有什么想法吗?这似乎很容易,但我遇到了麻烦。如果一切都失败了,我可以使用浮点运算来做到这一点。但是,我喜欢使用更有效的方法(并学习一些东西)而不是用浮点数和四舍五入强制它的想法。
*因子“C”可以是任何缩放(或规范化)“P”的东西,至少需要一个仅使用低半字节的短整型(BYTE)类型,分为 16 个级别; 0/15 到 15/15。 'P' 已经是一个 4 位数字,但我想对其应用“增益”以将其从给定值(可能是 0/15 到 15/15)按比例缩小,或者如果增益保持不变值 = 100%。例如,如果 P = 15/15 (0x0F) 且 C = 100%,则 S = 15/15 (0x0F)。现在如果 P = 8/15 (0x07) 且 C = 50%,则 S = 4/15 (0x03)。如果 P = 0,则所有 S = 0。如果 C = 0,则所有 S = 0。对于 P > 0 和 C > 0 但给出 S = 0 的情况(即 P 和 C 的值较低),我将有条件设置 S = 1 (1/15 = 0x01)。这种情况是特定于问题的。
【问题讨论】:
-
如果
C不是float,则此操作将是微不足道的。比例因子可以是int吗?C在0.0 to 1.0范围内有大约 1600 万个组合。如果对C的产生有更多了解,可以进行一些简化。
标签: c floating-point integer bit-manipulation microcontroller