簡體   English   中英

C語言中的地圖編號

[英]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,
}

還是有另一種方法? 謝謝! 最高

兩個最明顯的解決方案是:

  1. 使用數組。 const uint8_t masks[] = { 1, 3, ... }
  2. 您的掩碼似乎是“應設置第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM