[英]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.