JavaScript 位运算符

4

我想知道是否有一种方法可以找出给定的二进制模式中,两个或更多个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就可以认为是正确的。

数据是在数组缓冲区还是字符串中? - guest271314
1
第二个例子为什么是有效的?它不应该是真的吗? - Rajesh
1
每个数组都包含四个元素吗?你能在stacksnippets中包含数据的数组表示吗? - guest271314
第二个是错误的,因为只有一个1符合匹配模式。 - cocacrave
2
你可以使用 & 然后 计算位数 - Bergi
2个回答

4
如果您将两个模式and在一起,您将得到一个仅在两个模式都有1的位置上设置位的模式。然后,您可以使用汉明重量算法之一来计算设置的位数。最简单的算法是下面的函数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 */

感谢这里提供了“Hamming Weight”这个术语。


感谢提供另一种解决方案。这个也可以工作。 - cocacrave

2

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;否则为 true。
编辑:andyg0808的答案更加通用。

我尝试了你的解决方案,它完美地运行了。非常感谢你。 - cocacrave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接