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
两个最明显的解决方案是:
- 使用数组。
const uint8_t masks[] = { 1, 3, ... }
.
- 您的掩码似乎是 "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
我如何映射这样的数字:
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
两个最明显的解决方案是:
- 使用数组。
const uint8_t masks[] = { 1, 3, ... }
. - 您的掩码似乎是 "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