Javascript 按位运算

Javascript Bitwise Op

我想知道是否有办法查明给定的二进制模式中是否有两个或多个 1 在另一个二进制模式中。我说模式是因为它的实际值并不能确定一个是否在另一个中。

例如,

0001 1110 0000 0000
0001 1111 0000 0000
--> true

0001 0000 1100 0000
0001 1111 0000 0000
--> false

0001 1100 0000 1000
0001 0000 0000 1111
--> true

0001 1000 1100 0000
0001 0000 0000 1111
--> false

我尝试使用各种 AND/OR/XOR/NOT 但不确定如何使用。 请帮忙!

所以关于问题数据的问题是这样的:

const RANKS = [
  0b0000000001110001,
  0b0000001001000110,
  0b0001001100000100,
  0b0000000011011000,
];

我正在尝试遍历 RANKS 以查看它是否匹配模式:

const PATTERNS = [
  0b0001111100000000,
  0b0000111110000000,
  0b0000011111000000,
];

RANK 中只有 2 个 1 必须在 PATTERN 中 "fit" 才能被视为真

如果将两个模式 and 放在一起,您将得到一个模式,其位仅设置在两个模式都有 1 的位置。然后,您可以使用 Hamming Weight 的一种算法来计算已设置的位数。最简单的算法是以下函数 count:

function count(num) {
  var c = 0;
  while (num > 0) {
    if (num & 1) {
      c++;
    }
    num = num >>> 1;
  }
  return c;
}
console.log(count(1)); /* 1 */
console.log(count(2)); /* 1 */
console.log(count(3)); /* 2 */

H/T 到 here 汉明权重

function sharesAtLeastTwoBits(x, y) {
  var a = x & y;
  if (!a) return false;
  while (!(a & 1)) a >>>= 1;
  return a != 1;
}

console.log(sharesAtLeastTwoBits(
  0b0001111000000000,
  0b0001111100000000
))

console.log(sharesAtLeastTwoBits(
  0b0001000011000000,
  0b0001111100000000
))

console.log(sharesAtLeastTwoBits(
  0b0001110000001000,
  0b0001000000001111
))

console.log(sharesAtLeastTwoBits(
  0b0001100011000000,
  0b0001000000001111
))

使用&找出它们的共同点。如果没有位是共同的,false。如果不是,则右移直到最低位在第0位;如果它是唯一的位1,则整数是1,所以又是false;否则为真。

编辑:andyg0808 的回答更为笼统。