我需要一个8位的数字转换(0 - 255或#0 - #FF)与其12位等效(0 - 4095或#0 - #FFF)将8位变换为一个比例12位等效
我不想只做一个相同数字的直接转换。我想要代表相同的比例,但只有12比特。
例如: -
0xFF的在8位应该转换为0xFFF的在12位
为0x0在8位应该转换为0x0在12位
0x7F的在8位应该转换到0x7FF在12位
在8位0X24应转换为0x249在12位
是否有我应该使用的特定算法或技术?
我编码使用C
我需要一个8位的数字转换(0 - 255或#0 - #FF)与其12位等效(0 - 4095或#0 - #FFF)将8位变换为一个比例12位等效
我不想只做一个相同数字的直接转换。我想要代表相同的比例,但只有12比特。
例如: -
0xFF的在8位应该转换为0xFFF的在12位
为0x0在8位应该转换为0x0在12位
0x7F的在8位应该转换到0x7FF在12位
在8位0X24应转换为0x249在12位
是否有我应该使用的特定算法或技术?
我编码使用C
尝试x << 4 | x >> 4
。
这已经由OP更新,从X < < 4 + X >> 4
+1,只是将8位数的最高有效位复制到12位数的低4位中,结果通常非常接近使用除法的解决方案。它还处理0和0xff的所有边界情况。 –
如果你能够去通过一个更大的领域,那么这可能有助于改变:
b = a * ((1 << 12) - 1)/((1 << 8) - 1)
它很难看,但保留几乎按要求缩放。当然你可以把常量。
什么:
x = x ?((x + 1) << 4) - 1 :0
您能通过左移和/或减1(或增加)近似?像3位的110到1100位的4位,6到12为7到15的最大值(减去14)。 –
我可能刚刚离开那个......我注意到这可能是一个解决方案,因为我正在执行上面的计算。这些数值将用于驱动LED照明,因此完整的精度并不是非常重要。我需要测试以确定它是否有所作为,因此我有兴趣了解是否有其他方法可以完成此任务。 – Remixed123
在这种情况下,左移4个听起来就像是最简单的方法。这会导致大约1%的不准确,这不太可能引起注意。 –