2012-03-31 16 views
20

Próbuję w javascript, aby przekonwertować liczbę całkowitą (co wiem, że będzie między 0 a 32), do tablicy 0 i 1s. Mam spojrzał wokół, ale nie mógł znaleźć coś, co działa ..JavaScript - konwersja liczby całkowitej na tablicę bitów

Więc jeśli mam całkowitą, 22 (binarnie 10110) Chciałbym uzyskać do niego dostęp, jak:

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

jakieś sugestie? Dziękujemy

+0

Tablica bitów nie bajt. A tablica 0 i 1 jest prawdopodobnie tylko tablicą int. – GolezTrol

Odpowiedz

39

przeliczyć podstawa 2:

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

dostęp bohaterów (bity):

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

Fantastycznie, to działa tak dobrze! Patrzyłem na operacje zmiany bitów na wieki, ale jest to znacznie szybsze. Wielkie dzięki!! – DimC

+0

U napisał "tablica bitów", więc ---> var base2 = (yourNumber) .toString (2) .split (''); <--- da ci każdy znak (ciąg, wciąż musisz sparsować) w tablicy. – sebilasse

+1

Co zawiera wrapping _yourNumber_ w nawiasach? Jeśli uruchomię 'var base2 = 5.toString (2);' to nie zadziała, więc jestem ciekawy ... Dzięki! –

2

ten powinien zrobić

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

Podoba mi się to rozwiązanie –

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

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

alert(b); 

Zakładając 5 bitów (wydawało z pytaniem), więc 0 <= a < 32. Jeśli chcesz, możesz zwiększyć rozmiar 5, upto 32 (bitshiftacja w JavaScript działa z 32-bitową liczbą całkowitą).

1

można przekonwertować liczbę całkowitą ciąg binarny tak. Zwróć uwagę na parametr base 2.

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

Można uzyskać dostęp do znaków w ciąg tak, jakby była tablicą:

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

Ponadto ten kod daje 32length tablica

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

Daje to ciągi o długości 31.Trzecia linia powinna być: var baseL_ = new Array (33 - base2_.length) .join ("0"); – Sam

1

Opierając się na poprzednich odpowiedzi: ty może chcieć, aby tablica była tablicą liczb całkowitych, a nie łańcuchów, więc tutaj jest jedna linijka:

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

Zauważ, że krótsza wersja, (11).toString(2).split('').map(parseInt) nie zadziała (chrom) z nieznanych mi rozumu przekształca "0" s do NaN s

+0

'map (parseInt)' nie działa, ponieważ 'Array.prototype.map (') dostarcza 3 args dla swojego wywołania zwrotnego, z których 2 jest tablicą _index_. 'parseInt()' oczekuje 2 argumentów, z których drugi to _radix_. –

+0

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

1

może to zrobić w następujący sposób;

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