gpt4 book ai didi

c - 嵌入式 C - 在 switch/case 和 hashtable 之间选择

转载 作者:太空狗 更新时间:2023-10-29 16:10:50 26 4
gpt4 key购买 nike

我在 C 语言中使用带有 ARM 芯片的自制板。我的代码必须快速执行,而且我也有空间限制。现在,我必须编写一个十六进制值的“解析器”。每个十六进制数必须与一个十进制数(1;2;3 或 4)相关联。现在,我认为它在未来不会有太大变化,我有 100 个十六进制值要解析。十六进制值是“随机的”,没有特定的模式。

我从一个 switch/case 开始,像那样:

switch (i)
{
case 0xF3:
case 0xF7:
case 0x02:
return 1;
break;

case 0x20:
case 0x40:
case 0xE0:
case 0xC0:
return 2;
break;

case 0x21:
case 0x41:
case 0x81:
case 0x61:
case 0xA1:
return 3;
break;


case 0xBB:
case 0xCC:
case 0x63:
return 4;
break;

default:
return 0;
break;
}

但我考虑的是哈希表。当然,在最坏的情况下它会更快,但它会占用更多空间,哈希表真的值得为 100 个值使用吗?

感谢您的回答,如果您想要精确度,请问!

安托万

最佳答案

您可以将值放入 256 字节的数组中以便快速访问:

static uint8_t const table[256] = { 2, 3, 1, 4, ... };
return table[i];

您只使用了 256 个值中的 100 个,因此存在浪费空间的“漏洞”,但它可以与 switch 竞争。

但由于您只需要 4 个值,因此可以用 2 位表示。您可以将四个值打包到一个字节中。只需使用值 0-3 而不是 1-4:

#define PACK4(a, b, c, d) \
(((a)-1 << 0) | ((b)-1 << 2) | ((c)-1 << 4) | ((d)-1 << 6))
static uint8_t const table[64] = { PACK4(2, 3, 1, 4), PACK4(... };
int byteOffset = i / 4;
int bitOffset = i % 4 * 2;
return (table[byteOffset] >> bitOffset & 0x03) + 1;

关于c - 嵌入式 C - 在 switch/case 和 hashtable 之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com