Использование битовых масок для определения, установлены ли 2 или более логических значений - PullRequest
0 голосов
/ 02 октября 2018

Предположим, у меня есть следующие логические значения:

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.

1 Ответ

0 голосов
/ 02 октября 2018

Добавление логических значений в javascript приводит значения к числам ... false => 0, true => 1

, поэтому

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

, если, однако, ae не гарантированно будет логическим, но может быть true / falsey, сначала приведите значение к логическому (!!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;
...