2016-09-06 5 views
4

与えられたバイナリパターンが2つ以上あるかどうかを調べる方法があるかどうかは、別のバイナリパターン内にあるのだろうと思いました。私はパターンと言うのは、その実際の価値があるものが他のものの中にあるかどうかを判断しないからです。例えばJavascript Bitwise Op

、私はAND/OR/XOR/NOTではなく、それを行う方法がわからのさまざまな方法を使ってみました

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 

。 助けてください!

だから、問題のデータについての質問は、このようなものです:

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

私はそれがパターンに一致するかどうかを確認するためにRANKSにわたってループ処理をしようとしている:

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

のみ2の1からRANKまでがPATTERNに「適合」して真とみなさなければならない

+0

データは配列バッファまたは文字列ですか? – guest271314

+0

配列内にあります – cocacrave

+1

2番目の例はどのように有効ですか。それは真実ではないでしょうか – Rajesh

答えて

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となります。そうでなければ真。

EDIT:andyg0808の回答がより一般的です。

+0

私はあなたのソリューションを試して、それは完全に動作します。ありがとうございます。 – cocacrave

4

and 2つのパターンを合わせると、両方のパターンの位置にのみビットが設定されたパターンが得られますsは1です。 Hamming Weightのアルゴリズムの1つを使用して、設定されているビット数をカウントできます。用語ハミングウェイトためhere

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:最も単純なアルゴリズムは、次の関数countだろう。

+0

ありがとう溶液。これも同様に機能します。 – cocacrave

関連する問題