gpt4 book ai didi

c - 当索引不连续时设置查找表的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 03:36:04 27 4
gpt4 key购买 nike

我有两个这样定义的枚举

enum foo {
foo_a = 0x1,
foo_b = 0x2,
foo_c = 0x4,
foo_d = 0x8,
foo_e = 0x10,
..etc..
}

enum bar {
bar_a = 0x1,
bar_b = 0x2,
bar_c = 0x4,
bar_d = 0x8,
bar_e = 0x10,
..etc..
}

现在,foo_[az] 和 bar_[az] 之间存在 1 对 1 的映射,我想快速查找一下。最明显的方法是声明类似

int table[][] = {
[foo_a] = bar_c,
[foo_b] = bar_a,
[foo_c] = bar_b,
..etc..
}

然后使用result = table[(enum foo)temp]查找它。但由于这些枚举是按位声明的,table 的大小呈指数级增长。

是否有更简单的方法在编译时进行设置?

我考虑过做类似的事情

int table[][] = {
[LOG(foo_a)] = bar_c,
[LOG(foo_b)] = bar_a,
[LOG(foo_c)] = bar_b,
..etc..
}

这会减少内存占用,但我不知道无论如何要在编译时计算 LOG。

还有其他建议吗?

我唯一的限制如下,我无法以任何方式修改枚举,因为更改它们会导致二进制不兼容。

编辑:首选编译时解决方案

最佳答案

是的,只要参数是 2 的幂,您就可以“在编译时计算日志”:

#define LOG2P2(m) (((m)-1)/(((m)-1)%255+1) / 255%255*8 + 7-86/(((m)-1)%255+12))

这适用于 m 的值,最高可达 2**2040 左右(比实际 C 实现上的任何类型都大得多),并且有一个版本适用于更大的值,我得到了这来自对以下问题的回答:

https://stackoverflow.com/a/4589384/379897

关于c - 当索引不连续时设置查找表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15352771/

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