2014-01-19 48 views
3

我需要一个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

+1

您能通过左移和/或减1(或增加)近似?像3位的110到1100位的4位,6到12为7到15的最大值(减去14)。 –

+0

我可能刚刚离开那个......我注意到这可能是一个解决方案,因为我正在执行上面的计算。这些数值将用于驱动LED照明,因此完整的精度并不是非常重要。我需要测试以确定它是否有所作为,因此我有兴趣了解是否有其他方法可以完成此任务。 – Remixed123

+1

在这种情况下,左移4个听起来就像是最简单的方法。这会导致大约1%的不准确,这不太可能引起注意。 –

回答

6

尝试x << 4 | x >> 4

这已经由OP更新,从X < < 4 + X >> 4

+0

+1,只是将8位数的最高有效位复制到12位数的低4位中,结果通常非常接近使用除法的解决方案。它还处理0和0xff的所有边界情况。 –

3

如果你能够去通过一个更大的领域,那么这可能有助于改变:

b = a * ((1 << 12) - 1)/((1 << 8) - 1) 

它很难看,但保留几乎按要求缩放。当然你可以把常量。

2

什么:

x = x ?((x + 1) << 4) - 1 :0