Liczby ujemne do ciągu binarnego w JavaScript

Ktoś wie dlaczego javascript Number.toString funkcja nie przedstawia poprawnie liczb ujemnych?

//If you try
(-3).toString(2); //shows "-11"
// but if you fake a bit shift operation it works as expected
(-3 >>> 0).toString(2); // print "11111111111111111111111111111101"

Jestem naprawdę ciekaw, dlaczego to nie działa prawidłowo lub dlaczego to działa w ten sposób? Przeszukałem go, ale nie znalazłem nic, co by pomogło.

Author: fernandosavio, 2013-04-22

3 answers

-3 >>> 0 (prawe przesunięcie logiczne) zmusza argumenty do niepodpisanych liczb całkowitych, dlatego otrzymujemy reprezentację dopełniacza 32-bitowego dwójki równą -3.

Http://en.wikipedia.org/wiki/Two%27s_complement

Http://en.wikipedia.org/wiki/Logical_shift

 25
Author: Steve Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-22 19:59:27
var binary = (-3 >>> 0).toString(2); // coerced to uint32

console.log(binary);

console.log(parseInt(binary, 2) >> 0); // to int32

On jsfiddle

Wyjście To

11111111111111111111111111111101
-3 
 16
Author: Xotic750,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-22 20:01:36

Krótka odpowiedź:

  1. Funkcja toString() w zasadzie pobiera dziesiętny, konwertuje go do binary i dodaje znak" -".

  2. Zero fill right shift konwertuje operand na 32 podpisany bit liczba całkowita w formacie dwóch uzupełnień.

Bardziej szczegółowa ODPOWIEDŹ:

Pytanie 1:

//If you try
(-3).toString(2); //show "-11"

Jest w funkcji .toString(). Kiedy wypisujesz liczbę przez .toString():

Składnia

NumObj.toString ([radix])

Jeśli numObj jest ujemny, znak jest zachowany. tak jest nawet jeśli radix wynosi 2; zwracany łańcuch jest dodatnim binarnym reprezentacja numObj poprzedzona znakiem a, a nie dwoma uzupełnienie numObj.

Więc w zasadzie pobiera dziesiętny, konwertuje go na binarny i dodaje znak" -".

  1. baza 10 " 3 "zamieniona na bazę 2 to" 11 "
  2. Dodaj znak daje nam "-11"

Pytanie 2:

// but if you fake a bit shift operation it works as expected
        (-3 >>> 0).toString(2); // print "11111111111111111111111111111101"

Zero fill right shift konwertuje operand na 32-bitową liczbę całkowitą .

Operandy wszystkich operatorów bitowych są konwertowane do podpisanych 32-bitowych liczby całkowite w formacie dopełniacza dwójki.

 12
Author: Daan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 15:11:44