使用位掩码确定是否设置了 2 个或更多布尔值
Using bitmasks to determine if 2 or more booleans are set
假设我有以下布尔值:
var a;
var b;
var c;
var d;
var e;
我不在乎具体哪些是真的,哪些是假的,只要至少有 2 个(或更多)是真的。
我会或可以使用位掩码(或从这些变量生成一个)来确定这一点,而不必 运行 每个排列如下:
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.
在 javascript 中添加布尔值将值强制转换为数字 ... false=>0,true=>1
因此
if ((a + b + c + d + e) > 1) {
// at least 2 are true
}
但是,如果不能保证 a-e 是布尔值,但可以是 truthy/falsey,首先将值强制转换为布尔值(!!v
变为真或假)并将它们相加
if ((+!!a + !!b + !!c + !!d + !!e) > 1) {
// at least 2 are true
}
进一步评论
how to tell if 2 or more bits are set (without caring which one)
if (x & (x - 1)) {
// at least two bits set in x
}
或者如果您想要对 n
位设置进行更通用的测试
const testIfNBitsSet = (v, n) => v.toString(2).split('1').length > n;
假设我有以下布尔值:
var a;
var b;
var c;
var d;
var e;
我不在乎具体哪些是真的,哪些是假的,只要至少有 2 个(或更多)是真的。
我会或可以使用位掩码(或从这些变量生成一个)来确定这一点,而不必 运行 每个排列如下:
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.
在 javascript 中添加布尔值将值强制转换为数字 ... false=>0,true=>1
因此
if ((a + b + c + d + e) > 1) {
// at least 2 are true
}
但是,如果不能保证 a-e 是布尔值,但可以是 truthy/falsey,首先将值强制转换为布尔值(!!v
变为真或假)并将它们相加
if ((+!!a + !!b + !!c + !!d + !!e) > 1) {
// at least 2 are true
}
进一步评论
how to tell if 2 or more bits are set (without caring which one)
if (x & (x - 1)) {
// at least two bits set in x
}
或者如果您想要对 n
位设置进行更通用的测试
const testIfNBitsSet = (v, n) => v.toString(2).split('1').length > n;