Javascript - конвертировать целое число в массив битов
Я пытаюсь в JavaScript преобразовать целое число (которое я знаю, будет между 0 и 32), в массив от 0 до 1 с. Я посмотрел вокруг, но не смог найти то, что работает..
Итак, если у меня есть целое число 22 (двоичное 10110), я хотел бы получить к нему доступ как:
Bitarr[0] = 0
Bitarr[1] = 1
Bitarr[2] = 1
Bitarr[3] = 0
Bitarr[4] = 1
Какие-либо предложения? Большое спасибо
8 ответов
Преобразовать в базу 2:
var base2 = (yourNumber).toString(2);
получить доступ к символам (битам):
base2[0], base2[1], base2[3], etc...
SHORTESST (ES6)
Кратчайшая версия (32 символа), которая заполняет последние биты нулями. Я предполагаю что n
твой номер, b
является базой (количество выходных бит):
[...Array(b)].map((x,i)=>n>>i&1)
пример
// You can create following function:
//
// let bits = (n,b=32) => [...Array(b)].map( (x,i) => (n>>i)&1 );
//
// bits(63,8) => [1, 1, 1, 1, 1, 1, 0, 0]
// bits(63,8).reverse().join('') => "00111111"
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-битным целым числом).
Вы можете преобразовать ваше целое число в двоичную строку следующим образом. Обратите внимание на параметр base 2.
var i = 20;
var str = i.toString(2); // 10100
Вы можете получить доступ к символам в String, как если бы это был массив:
alert(str[0]); // 1
alert(str[1]); // 0
etc...
Это должно сделать
for(int i = 0; i < 32; ++i)
Bitarr[i] = (my_int >> i) & 1;
Основываясь на предыдущих ответах: вы можете захотеть, чтобы ваш массив представлял собой массив целых чисел, а не строк, так что вот одна строка:
(1234).toString(2).split('').map(function(s) { return parseInt(s); });
Обратите внимание, что более короткая версия, (11).toString(2).split('').map(parseInt)
не будет работать (хром), по неизвестной мне причине он конвертирует "0"
с NaN
s
Вы можете сделать следующее:
var n = 1071,
b = Array(Math.floor(Math.log2(n))+1).fill()
.map((_,i,a) => n >> a.length-1-i & 1);
console.log(b);
Кроме того, этот код дает массив 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
Просто ради ссылки:
(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