2012-03-31 11 views
20

Estoy intentando en javascript convertir un número entero (que sé que estará entre 0 y 32), en una matriz de 0 y 1. He mirado alrededor, pero no pude encontrar algo que funcione ..Javascript - convertir entero en una matriz de bits

Por lo tanto, si tengo un entero como 22 (binario 10110), me gustaría acceder a él como:

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

¿Alguna sugerencia? Muchas gracias

+0

Una matriz de bits que no es un byte. Y una matriz de 0 y 1 es probablemente solo una matriz de int. – GolezTrol

Respuesta

39

convertir a la base 2:

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

el acceso de los personajes (bits):

base2[0], base2[1], base2[3], etc... 
+1

¡Fantástico, esto funciona tan bien! Estuve mirando operaciones de cambio de bits durante años, pero esto es mucho más rápido. ¡¡Muchas gracias!! – DimC

+0

U escribió "matriz de bits", por lo que ---> var base2 = (suNúmero) .toString (2) .split (''); <--- le dará cada carácter (cadena, aún tiene que analizar) dentro de una matriz. – sebilasse

+1

¿Qué hace envolviendo _yourNumber_ entre paréntesis? Si ejecuto 'var base2 = 5.toString (2);' no funcionará, entonces tengo curiosidad ... ¡Gracias! –

2

Esto debería hacer

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

Me gusta esta solución –

6
var a = 22; 
var b = []; 

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

alert(b); 

Suponiendo 5 bits (parecía de su pregunta), por lo 0 <= a < 32. Si lo desea, puede ampliar el 5, hasta 32 (el cambio de bits en JavaScript funciona con un entero de 32 bits).

1

usted puede convertir su entero a una cadena binaria como este. Tenga en cuenta el parámetro base 2.

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

Puede acceder a caracteres en una cadena como si se tratara de una matriz:

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

Además, este código da 32length gama

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

Esto da cadenas de longitud 31.La tercera línea debe ser: var baseL_ = new Array (33 - base2_.length) .join ("0"); – Sam

1

La construcción de las respuestas anteriores: se Puede querer que su matriz sea una matriz de enteros, no de cadenas, así que aquí hay un trazo:

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

Tenga en cuenta, que la versión más corta, (11).toString(2).split('').map(parseInt) no funcionará (cromo), por desconocida para mi razón se convierte "0" s a NaN s

+0

'map (parseInt)' no funciona, porque 'Array.prototype.map (') proporciona 3 argumentos para su devolución de llamada, de los cuales el 2do es el conjunto _index_. 'parseInt()' espera 2 argumentos, de los cuales el 2 es el _radix_. –

+0

'' '(11) .toString (2) .split (''). Map (val => parseInt (val))' '' –

1

Es posible hacer de la siguiente manera;

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

Cuestiones relacionadas