2014-01-19 66 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