[英]Map numbers in C language
我如何映射這樣的數字:
1 => 0x01;
2 => 0x03;
3 => 0x07;
4 => 0x0F;
....
8 => 0xFF;
我只有8個要映射的數字,而我的RT嵌入式系統需要這個數字,因此解決方案必須高效。 有沒有一種方法可以使用ENUM或DEFINE來實現? 我不想使用switch語句。 我應該使用數組嗎:
BYTE bMap[8] =
{
0x01,
0x03,
0x07,
0x0F,
....
0xFF,
}
還是有另一種方法? 謝謝! 最高
兩個最明顯的解決方案是:
const uint8_t masks[] = { 1, 3, ... }
。 i + 1
最右邊的位”,因此您可以在運行時使用(1 << (i + 1)) - 1
進行簡單的計算,這更易於實現且不易出錯。 如果只有8個值並且不會改變,請使用數組。 但是請注意,映射將是0=>0x01, 1=>0x03, ...
等,因為C索引是從零開始的。
另外,在您的數字中尋找一種模式:您可以找到將字節中的最低有效N位設置為1的邏輯或算術運算。 即N =>(2 * N)-1
使用查找表獲取數字沒有錯 ,但是您可以考慮使用另一種方法。
如果您只是按順序遍歷這些值,則可以通過左移前一個值並將低位設置為1來獲得每個值:
0000 0001 (x01)
<< 1: 0000 0010
| 1: 0000 0011 (x03)
<< 1: 0000 0110
| 1: 0000 0111 (x07)
<< 1: 0000 1110
| 1: 0000 1111 (x0f)
<< 1: 0001 1110
| 1: 0001 1111 (x1f)
因此,類似:
for (unsigned int i = 1; i < 0x100; i = (i << 1) | 1) ...
應該可以。
唯一可能的優勢,我可以看到, 可能將不必出門到內存中以便查找表。 根據您的硬件體系結構,這可能是問題,也可能不是問題。
以下完整程序:
#include <stdio.h>
int main (void) {
unsigned int i;
for (i = 1; i < 0x100; i = (i << 1) | 1)
printf ("%02x ", i);
putchar('\n');
return 0;
}
顯示它的作用:
01 03 07 0f 1f 3f 7f ff
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.