使用位掩码来确定是否设置了2个或更多的布尔值

时间:2018-10-02 00:13:52

标签: javascript bit bit-shift bitmask

假设我有以下布尔值:

var a;
var b;
var c;
var d;
var e;

我不在乎哪个特定的是对还是错,只是至少两个(或更多)是对的。

是否可以使用位掩码(或从这些变量中生成一个位掩码)来确定这一点,而不必像这样运行每个置换:

if (a or b) || (a or c) || (a or d) || (a or e) || (b or c) || (b or d) || (b or e) || (c or d) || (c or e) || (d or e)

(编辑:正确的示例)

if (a and b) || (a and c) || (a and d) || (a and e) || (b and c) || (b and d) || (b and e) || (c and d) || (c and e) || (d and e)

Ta。

1 个答案:

答案 0 :(得分:2)

在javascript中添加布尔值会将值强制转换为数字... false => 0,true => 1

因此

if ((a + b + c + d + e) > 1) {
    // at least 2 are true
}

但是,如果a-e不能保证是布尔值,而是真实/错误,请先将值强制为布尔值(!!v为true或false),然后将它们加在一起

if ((+!!a + !!b + !!c + !!d + !!e) > 1) {
    // at least 2 are true
}

进一步评论

  

如何知道是否设置了2位或更多位(不关心哪一位)

if (x & (x - 1)) {
    // at least two bits set in x
}

或者如果您想对n位设置进行更通用的测试

const testIfNBitsSet = (v, n) => v.toString(2).split('1').length > n;