2016-11-04 19 views
0

数字のバイナリ 'コンポーネント'を取得しようとしたことがありますか?私がやろうとしている何JavaScriptビット単位のマスク

は次のようになります。それはバイナリで0101あるので、5:私は数を持って

。明らかに私はそれが1と4(0001と0100)であることを知っていますが、コードでそれを得る方法を理解することはできません。

MDNにはBitwise Operatorsについての素晴らしい記事がありますが、それでも喜びはありません。

+0

だから、あなたが目指しているアルゴリズムは何ですか? 1 + 4は1つの可能性に過ぎない。あなたはまた2 + 3を持っています –

+0

@VladimirM彼らは個々のビット(1 = 0001、4 = 0100)、すなわち2のべき乗を求めます。 3ビットは2ビット以上です。 – JJJ

+0

ちょうど文字列表現の1の位置を取得します。0から始まります。右から2までの位置は、探している値です。 – CBroe

答えて

2

var number = 5, 
 
    result = []; 
 

 
for(var i = 1; i <= number; i = i << 1) { 
 
    if(i & number) { 
 
    result.push(i & number); 
 
    } 
 
} 
 

 
console.log(result);

ビット単位のシフトを使用して、ループ増分2つ(1、2、4、8 ...)の累乗でii << 1が2で数を乗算し、またi *= 2を行うことができ)、元の数値にそのビットが設定されている場合はビット単位のAND(&)でチェックします。そうであれば、数値として結果配列に追加します。

+0

イエス様、とてもシンプルです。どうもありがとう! – eloleon

0

Number.prototype.toStringにradixパラメータを使用できます。

var number = 5; 
number.toString(2); // -> "101" 

あなたは、その文字列を分割し、番号自体が必要な場合Numberを使用してマッピングすることができます。

number.toString(2).split("").map(Number); // -> [1, 0, 1] 

変数を最初に格納したくない場合は、角かっこで囲んでください。ここで

5.toString(2).split("").map(Number); // -> SyntaxError 
(5).toString(2).split("").map(Number); // -> [1, 0, 1] 
0

は、ものまたはゼロのシリーズをもたらす発電機ベースのソリューションです:

const bits = *(n) => { do yield n & 1; while (n >>= 1); }; 

> console.log(Array.from(bits(5)); 
< [1, 0, 1] 

あなたは、2つの対応力で結果を乗算し、またはゼロを除外する可能性があり、場合あなたはとても傾倒しています。