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.
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.
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
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ź:
Funkcja
toString()
w zasadzie pobiera dziesiętny, konwertuje go do binary i dodaje znak" -".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" -".
- baza 10 " 3 "zamieniona na bazę 2 to" 11 "
- 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.
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