Javascript - конвертировать целое число в массив битов - PullRequest
30 голосов
/ 31 марта 2012

Я пытаюсь в javascript преобразовать целое число (которое, я знаю, будет между 0 и 32), в массив от 0 до 1 с. Я посмотрел вокруг, но не смог найти то, что работает ..

Итак, если у меня есть целое число 22 (двоичное 10110), я хотел бы получить к нему доступ как:

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

Есть предложения? Большое спасибо

Ответы [ 9 ]

60 голосов
/ 31 марта 2012

преобразование в основание 2:

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

доступ к символам (битам):

base2[0], base2[1], base2[3], etc...
8 голосов
/ 31 марта 2012
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-битным целым числом).

3 голосов
/ 31 марта 2012

Это должно сделать

for(int i = 0; i < 32; ++i)
  Bitarr[i] = (my_int >> i) & 1;
1 голос
/ 02 ноября 2018

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 голос
/ 24 ноября 2016

Вы можете сделать следующее:

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 голос
/ 21 ноября 2016

Основываясь на предыдущих ответах: вы можете захотеть, чтобы ваш массив представлял собой массив целых чисел, а не строк, поэтому вот строка с одной строкой:

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

Обратите внимание, что более короткая версия, (11).toString(2).split('').map(parseInt) не будет работать (хром), по неизвестной мне причине она конвертирует "0" с в NaN с

1 голос
/ 31 марта 2012

Вы можете преобразовать ваше целое число в двоичную строку следующим образом.Обратите внимание на параметр base 2.

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

Вы можете обращаться к символам в строке, как если бы это был массив:

alert(str[0]); // 1
alert(str[1]); // 0
etc...
0 голосов
/ 19 апреля 2019

только ради ссылки:

(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 голосов
/ 08 декабря 2014

Кроме того, этот код дает массив 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
...