标志位计算和检测

时间:2010-04-25 07:18:14

标签: javascript algorithm flags

在我正在研究的一些代码中,我应该处理十个独立的参数,这些参数可以采用两个值中的一个(0或1)。这会产生2 ^ 10个不同的条件。有些条件永远不会发生,可以省略,但那些确实发生的情况仍然很多,并且使switch处理所有案件都是疯了。

我想使用10个if语句而不是巨大的switch语句。为此,我知道我应该使用标志位,或者更确切地说标记字节,因为语言是javascript,并且更容易使用10字节字符串来表示10位二进制文​​件。

现在,我的问题是,我不知道如何实现这一点。我已经看到在API中使用了这个,其中多个可选择的选项以数字1,2,4,8,...,n ^(n-1)公开,它们是1,10,100的十进制等值,二十进制等。因此,如果我们像bar = foo(7)那样进行调用,则bar将是一个对象,其中包含三个最右边标志启用的任何选项。

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

3 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分: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

答案 2 :(得分:1)

您可以获得一个设置了第n位的数字,并将其与您的数字相加。如果结果为零,则您的数字没有设置位。否则就行了。再看here