假设我有一堆箱子,每个箱子都有一系列数字。一个例子是:
bin 1: 0-8
bin 2: 9-16
bin 3: 17-24
etc
有没有办法使用switch语句来确定一个数字属于哪个bin?我试图弄清楚如何使案例反映一个数字在一个范围内,但它们似乎不是“常数表达式”所以我不确定它是否可能......
修改
我应该更准确;我的箱子是两个人的力量......
bin 1: 0 to 2^3
bin 2: 2^3 + 1 to 2^4
bin 3: 2^4 + 1 to 2^5
etc
答案 0 :(得分:7)
您不能在C中使用case
标签的范围 - 仅限单个(常量表达式)值。
如果范围很小,就像您的示例一样,那么您可以这样做:
switch (value)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
bin = 1;
break;
case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16:
bin = 2;
break;
case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24:
bin = 3;
break;
default:
}
或者,您可以使用查找表:
static const int val_bin[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0 to 8 */
2, 2, 2, 2, 2, 2, 2, 2, /* 9 to 16 */
3, 3, 3, 3, 3, 3, 3, 3 /* 17 to 24 */
};
bin = val_bin[value];
或者,在某些情况下,您可以确定一个简单的公式。您当前的示例似乎是这样的情况:
bin = 1 + (value - 1 / 8);
回复编辑:
对于你的更新问题,关于2的幂,这实际上非常简单。您可以使用“位涂抹”技术将位于两个幂之间的所有值合并为一个值(假设您使用unsigned long
作为value
,最大值为{ {1}}):
2^32 - 1
答案 1 :(得分:2)
您可以将它们级联起来:
case 0:case 1: case 2: case 3: case 4: ..... case 8: do_something(); break; case 9: case 10: ....... etc
答案 2 :(得分:0)
如果您的编译器是GCC,那么您很幸运。 GCC有一个名为case ranges的扩展名,允许您像这样编写交换机:
switch (value) {
case 0 ... 8:
bin = 1;
break;
case 9 ... 16:
bin = 2;
break;
/* and so on */
}
这不是标准C!