5

在我正在处理的某些代码中,我应该处理十个独立参数,这些参数可以采用两个值(0 或 1)之一。这会创建 2^10 个不同的条件。有些情况永远不会发生,可以忽略不计,但确实发生的情况仍然很多,而且switch要处理所有情况是疯狂的。

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

现在,我的问题是,我不知道如何实现它。我已经看到在APIs 中使用了这个,其中多个可选选项以数字 1、2、4、8、...、n^(n-1) 显示,它们是 1、10、100、1000 等的十进制等价物。在二进制。因此,如果我们调用 like bar = foo(7), bar 将是一个对象,其中包含三个最右边的标志启用的任何选项。

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

4

3 回答 3

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.
    }
}
于 2010-04-25T07:20:55.280 回答
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
于 2010-04-25T07:26:27.517 回答
1

您可以获得一个设置了第 n 位的数字并将其与您的数字相加。如果结果为零,则您的号码没有设置位。否则,它做到了。也看这里

于 2010-04-25T07:21:41.177 回答