在我正在研究的一些代码中,我应该处理十个独立的参数,这些参数可以采用两个值中的一个(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>
答案 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。