我想知道是否有办法找出给定的二进制模式,两个或更多的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中考虑为真
答案 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的答案更为通用。