Javascript Bitwise Op

时间:2016-09-06 06:36:56

标签: javascript bit-manipulation bitwise-operators bit

我想知道是否有办法找出给定的二进制模式,两个或更多的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的1个中只有2个符合"适合"在PATTERN中考虑为真

2 个答案:

答案 0 :(得分:4)

如果将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

答案 1 :(得分: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;否则是真的。

编辑:andyg0808的答案更为通用。