2012-03-31 16 views
20

Sto provando in javascript per convertire un numero intero (che so sarà compreso tra 0 e 32), in un array di 0 e 1. Ho guardato in giro ma non ho trovato qualcosa che funziona ..Javascript - converti numero intero in matrice di bit

Quindi, se ho un intero come 22 (binario 10110), vorrei accedervi come:

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

Qualche suggerimento? Molte grazie

+0

Un array di bit non un byte. E un array di 0 e 1 è probabilmente solo un array di int. – GolezTrol

risposta

39

convertito alla base 2:

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

accesso dei personaggi (bit):

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

Fantastico, funziona così bene! Stavo guardando le operazioni di bit-shift da secoli ma questo è molto più veloce. Grazie molto!! – DimC

+0

U ha scritto "array of bit", quindi ---> var base2 = (yourNumber) .toString (2) .split (''); <--- ti darà ogni carattere (stringa, devi ancora analizzare) all'interno di un array. – sebilasse

+1

Cosa fa il wrapping _yourNumber_ tra parentesi? Se eseguo 'var base2 = 5.toString (2);' non funzionerà, quindi sono curioso ... Grazie! –

2

Questo dovrebbe fare

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

Mi piace questa soluzione –

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

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

alert(b); 

Supponendo 5 bit (sembrava dalla tua domanda), in modo 0 <= a < 32. Se lo desideri, puoi ingrandire lo 5 fino a 32 (il cambio di bit in JavaScript funziona con un numero intero a 32 bit).

1

è possibile convertire il vostro intero in una stringa binaria come questo. Notare il parametro di base 2.

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

È possibile accedere a caratteri in una stringa come se si trattasse di un array:

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

Inoltre, questo codice dà 32length serie

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

Questo dà stringhe di lunghezza 31.La terza riga deve essere: var baseL_ = new Array (33 - base2_.length) .join ("0"); – Sam

1

Costruire sulle risposte precedenti: si potrebbe volere che la matrice sia un array di numeri interi, non di stringhe, quindi ecco un one-liner:

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

nota, che la versione più corta, (11).toString(2).split('').map(parseInt) non funziona (cromo), per a me sconosciuto motivo converte "0" s per NaN s

+0

'map (parseInt)' non funziona, per 'Array.prototype.map (') fornisce 3 argomenti per il suo callback, di cui il 2 è l'array _index_. 'parseInt()' si aspetta 2 args, di cui il secondo è _radix_. –

+0

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

1

Si potrebbe procedere come segue;

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