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,
}

或者有别的办法吗? 谢谢!最大

如果您只有 8 个值并且不会改变,请使用数组。但请注意,映射将是 0=>0x01, 1=>0x03, ... 等,因为 C 索引是从零开始的。

此外,在您的数字中寻找一个模式:您可以找到一个逻辑或算术运算来设置一个字节中的最低有效 N 位。 IE。 N => (2 * N) -1

两个最明显的解决方案是:

  1. 使用数组。 const uint8_t masks[] = { 1, 3, ... }.
  2. 您的掩码似乎是 "the i + 1 rightmost bits should be set",因此您可以在运行时使用 (1 << (i + 1)) - 1 简单地计算它,这更容易实现且不易出错。

使用查找 table 获取号码没有什么 错误,但您可以 考虑另一种方法。

如果您只是简单地按顺序循环这些值,则可以通过左移前一个值并将低位设置为 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) ...

应该可以解决问题。

唯一可能我能看到可能的优点是不必去内存查找table.根据您的硬件架构,这可能是问题,也可能不是问题。

完整程序如下:

#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