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 的回答更为笼统。
我想知道是否有办法查明给定的二进制模式中是否有两个或多个 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 的回答更为笼统。