【问题标题】:Using bitmasks to determine if 2 or more booleans are set使用位掩码确定是否设置了 2 个或更多布尔值
【发布时间】:2018-10-02 00:13:52
【问题描述】:

假设我有以下布尔值:

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。

【问题讨论】:

  • permutation like this - 如果其中任何一个变量为真,则排列为真 - 所以,这不是一个好的开始 - 我认为那些 or 应该是 && ......无论如何。 .. if ((+!!a +!!b +!!c +!!d +!!e) > 1) - 或者如果这些变量保证是布尔值if ((a+b+c+d+e) > 1)
  • 是的,你是对的,而不是括号中的部分。 +!!是的。我没想过将布尔值转换为int。如果您将其写为答案,我可以接受。另外,这可以通过口罩实现吗?假设我改述说,如何判断是否设置了 2 位或更多位(不关心哪一个)
  • 当然是
  • 我现在在答案中添加了测试位

标签: javascript bit bit-shift bitmask


【解决方案1】:

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

因此

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

但是,如果 a-e 不能保证为布尔值,但可能是真/假,则首先将值强制为布尔值(!!v 变为真或假)并将它们相加

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;

【讨论】:

  • 感谢您在此处扩大答案!很高兴看到位掩码替代方案。测试很可能最终会使用位掩码来保存 db 列。现在我们只是继续为每个“活跃”的新集成添加列,因此,“真实”。
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 2017-03-06
  • 2015-08-11
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多