gpt4 book ai didi

c++ - 在 C/C++ 中避免重复和简单的 switch case?

转载 作者:太空狗 更新时间:2023-10-29 23:32:34 28 4
gpt4 key购买 nike

我在互联网上找到了一段代码,它的目标非常简单,但使用的方法却很丑陋。据推测,作者正在使用 switch case 来确定先前定义的 Enum 的一些(非连续)值是否属于其范围。如果是,该函数返回 true,仅此而已。否则,它返回 false

它实际上看起来像这样:

switch(value) {
case ONE:
case TWO:
/* many similar lines later */
case TWENTY:
case TWENTY_FIVE:
/* an afternoon later */
case ONE_HUNDRED:
return true;
default:
return false;
}

由于编译器生成的跳转表,他们使用 switch case 进行即时查找是合理的(尽管跳转表并不一定意味着根据我收集的内容进行即时查找)。即便如此,这也会产生无数行不必要的代码。

我读过有关函数内联和使用函数指针数组的内容,但我不知道如何在这种特定情况下使用它。

我如何避免用这样一个简单的案例(没有双关语意)编写 许多case X:

最佳答案

根据一些绑定(bind)整数有效地计算一个 bool 值是一个位的工作:

const unsigned long long ps[2] = {0x28208a20a08a28ac, 0x800228a202088288};

bool is_prime(unsigned x)
{
return (x < 128) && ((ps[x >> 6] >> (x & 63)) & 1);
}

如果您查看存储在数组中的数字的二进制表示,1 位表示质数,0 位表示复合数:

   2    8    2    0    8    a    2    0    a    0    8    a    2    8    a    c
0010 1000 0010 0000 1000 1010 0010 0000 1010 0000 1000 1010 0010 1000 1010 1100
59 47 41 31 23 17 11 5 2
61 53 43 37 29 19 13 7 3

要将其扩展到超过 128 个数字,只需增加数组大小并修补 <比较 is_prime .常数 6 和 63 源于 unsigned long long 中的位数.

关于c++ - 在 C/C++ 中避免重复和简单的 switch case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706666/

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