web-dev-qa-db-ja.com

Javascript-整数をビットの配列に変換します

私はJavascriptで整数(0と32の間になることがわかっています)を0と1の配列に変換しようとしています。周りを見回しましたが、動作するものが見つかりませんでした。

したがって、22(バイナリ10110)の整数がある場合、次のようにアクセスします。

Bitarr[0] = 0
Bitarr[1] = 1
Bitarr[2] = 1
Bitarr[3] = 0
Bitarr[4] = 1

助言がありますか?どうもありがとう

31
DimC

基数2に変換:

var base2 = (yourNumber).toString(2);

文字(ビット)にアクセスします。

base2[0], base2[1], base2[3], etc...
61
nobody
var a = 22;
var b = [];

for (var i = 0; i < 5; i++)
  b[i] = (a >> i) & 1;

alert(b);

(あなたの質問から見えたように)5ビットを想定しているので、0 <= a < 32。必要に応じて、5大きく、最大32(JavaScriptのビットシフトは32ビット整数で機能します)。

8
GolezTrol

これはすべきです

for(int i = 0; i < 32; ++i)
  Bitarr[i] = (my_int >> i) & 1;
3
Salepate

このように整数をバイナリ文字列に変換できます。ベース2パラメータに注意してください。

var i = 20;
var str = i.toString(2); // 10100

String内の文字に配列のようにアクセスできます。

alert(str[0]); // 1
alert(str[1]); // 0
etc...
1
Jivings

次のようにすることができます。

var n = 1071,
    b = Array(Math.floor(Math.log2(n))+1).fill()
                                         .map((_,i,a) => n >> a.length-1-i & 1);
console.log(b);
1
Redu

以前の答えを基にして、配列を文字列ではなく整数の配列にしたい場合があるので、ここにワンライナーを示します:

(1234).toString(2).split('').map(function(s) { return parseInt(s); });

短いバージョンの(11).toString(2).split('').map(parseInt)は機能しないことに注意してください(クロム)。理由は不明ですが、"0"sをNaNsに変換します。

1
Lex

SHORTESST(ES6)

最後のビットをゼロで埋める最短(32文字)バージョン。 nはあなたの数、bはベース(出力ビット数)だと思います:

[...Array(b)].map((x,i)=>n>>i&1)
let bits = (n,b=32) => [...Array(b)].map((x,i)=>(n>>i)&1);

let Bitarr = bits(22,8);

console.log(Bitarr[0]); // = 0
console.log(Bitarr[1]); // = 1
console.log(Bitarr[2]); // = 1
console.log(Bitarr[3]); // = 0
console.log(Bitarr[4]); // = 1
1

参考までに:

(121231241).toString(2).split('').reverse().map((x, index) => x === '1' ? 1 << index : 0).reverse().filter(x => x > 0).join(' + ');

あなたに与えるでしょう:

67108864 + 33554432 + 16777216 + 2097152 + 1048576 + 524288 + 65536 + 32768 + 16384 + 4096 + 1024 + 512 + 256 + 128 + 8 + 1
0
Trident D'Gao

さらに、このコードは32長の配列を提供します

function get_bits(value){
        var base2_ = (value).toString(2).split("").reverse().join("");
        var baseL_ = new Array(32 - base2_.length).join("0");
        var base2 = base2_ + baseL_;
        return base2;
    }
1 => 1000000000000000000000000000000
2 => 0100000000000000000000000000000
3 => 1100000000000000000000000000000
0
Vyacheslav