数字のバイナリ 'コンポーネント'を取得しようとしたことがありますか?私がやろうとしている何JavaScriptビット単位のマスク
は次のようになります。それはバイナリで0101あるので、5:私は数を持って
。明らかに私はそれが1と4(0001と0100)であることを知っていますが、コードでそれを得る方法を理解することはできません。
MDNにはBitwise Operatorsについての素晴らしい記事がありますが、それでも喜びはありません。
数字のバイナリ 'コンポーネント'を取得しようとしたことがありますか?私がやろうとしている何JavaScriptビット単位のマスク
は次のようになります。それはバイナリで0101あるので、5:私は数を持って
。明らかに私はそれが1と4(0001と0100)であることを知っていますが、コードでそれを得る方法を理解することはできません。
MDNにはBitwise Operatorsについての素晴らしい記事がありますが、それでも喜びはありません。
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 ...)の累乗でi
(i << 1
が2で数を乗算し、またi *= 2
を行うことができ)、元の数値にそのビットが設定されている場合はビット単位のAND(&
)でチェックします。そうであれば、数値として結果配列に追加します。
イエス様、とてもシンプルです。どうもありがとう! – eloleon
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]
は、ものまたはゼロのシリーズをもたらす発電機ベースのソリューションです:
const bits = *(n) => { do yield n & 1; while (n >>= 1); };
> console.log(Array.from(bits(5));
< [1, 0, 1]
あなたは、2つの対応力で結果を乗算し、またはゼロを除外する可能性があり、場合あなたはとても傾倒しています。
だから、あなたが目指しているアルゴリズムは何ですか? 1 + 4は1つの可能性に過ぎない。あなたはまた2 + 3を持っています –
@VladimirM彼らは個々のビット(1 = 0001、4 = 0100)、すなわち2のべき乗を求めます。 3ビットは2ビット以上です。 – JJJ
ちょうど文字列表現の1の位置を取得します。0から始まります。右から2までの位置は、探している値です。 – CBroe