2010-04-25 58 views
5

在我正在处理的一些代码中,我应该处理十个独立参数,它们可以取两个值(0或1)中的一个。这创造了2^10个不同的条件。有些情况从未发生过,可以省略,但是确实发生的情况仍然很多,并且使得所有情况都是疯狂的。标志位计算和检测

我想使用10 if语句而不是巨大的switch。为此,我知道我应该使用标志位,或者标志字节,因为语言是javascript,它更容易与10字节的字符串一起使用来表示10位二进制文​​件。

现在,我的问题是,我不知道如何实现这一点。我已经看到这在API s中使用,其中多个可选选项暴露为数字1,2,4,8,...,n ^(n-1),它们是1,10,100,1000等的十进制等价物二进制。因此,如果我们拨打电话bar = foo(7),酒吧将是一个对象,无论三个最右边的标志启用了什么选项。

我可以将十进制数转换为二进制数,并在每个if语句中检查是否设置了相应的数字。但我不知道,有没有办法确定n-th的十进制数字是零还是一位二进制形式,没有实际上是在做转换吗?

回答

6

只需使用按位和。在C/C++,这将是:

if (flags & 1) { 
    // Bit zero is set. 
} 
if (flags & 2) { 
    // Bit one is set. 
} 
if (flags & 4) { 
    // Bit two is set. 
} 
... 

对于生产善,使用符号名的标志掩码代替幻数,1,2,4,8,等等

如果标志在某些方面(例如,它们代表了一些几何问题·十种空间维度)和代码来处理每种情况下是一样的同质化,你可以使用一个循环:

for (int f = 0; f < 10; ++f) { 
    if (flags & (1 << f)) { 
     // Bit f is set. 
    } 
} 
+0

WOW!很快!我想马上接受你的回答,但显然我应该等待至少9分钟。非常感谢。 – 2010-04-25 07:24:56

+0

+1正在输入类似的内容,但速度更快;) – 2010-04-25 07:28:50

1

你可以得到一个数字,有第n位设置,并与你的号码进行和运算。如果结果为零,您的编号没有设置位。否则,它的确如此。也请看here

2

您可以使用按位和:

10 & 2^1 is true because 10 = 1010b 
           ^1 
8 & 2^1 is false because 8 = 1000b 
           ^0 
10 & 2^3 is true because 10 = 1010b 
          ^1