Chciałbym zobaczyć liczby całkowite, dodatnie lub ujemne, w postaci binarnej.
Raczej jak to pytanie , ale dla JavaScript.
javascript
numbers
barlop
źródło
źródło
Odpowiedzi:
Możesz użyć
Number.toString(2)
funkcji, ale ma ona pewne problemy przy reprezentowaniu liczb ujemnych. Na przykład(-1).toString(2)
dane wyjściowe to"-1"
.Aby rozwiązać ten problem, możesz użyć niepodpisanego operatora bitowego przesunięcia w prawo (
>>>
), aby zmusić swój numer do liczby całkowitej bez znaku.Jeśli uruchomisz
(-1 >>> 0).toString(2)
, przeniesiesz bity cyfry 0 w prawo, co nie zmienia samej liczby, ale będzie reprezentowane jako liczba całkowita bez znaku. Powyższy kod wyświetli się"11111111111111111111111111111111"
poprawnie.To pytanie zawiera dalsze wyjaśnienia.
źródło
Próbować
2 to podstawa i może być dowolną bazą między 2 a 36
źródło tutaj
AKTUALIZACJA:
Działa to tylko w przypadku liczb dodatnich, JavaScript reprezentuje ujemne binarne liczby całkowite w notacji dwóch uzupełnień. Zrobiłem tę małą funkcję, która powinna załatwić sprawę, nie przetestowałem jej poprawnie:
Miałem stąd pomoc
źródło
-3
zwrotów1
). Też uważam, żedec > 0
powinien byćdec >= 0
, który powinien przynajmniej naprawić 0. Ponieważdec2Bin(0)
zwraca10
.Plik binarny w „Convert to binary” może odnosić się do trzech głównych rzeczy. System liczb pozycyjnych, reprezentacja binarna w pamięci lub 32-bitowe ciągi bitów. (w przypadku 64-bitowych ciągów bitów patrz odpowiedź Patricka Robertsa )
1. System liczbowy
(123456).toString(2)
przekształci liczby w podstawowy system liczb pozycyjnych 2 . W tym systemie liczby ujemne są zapisywane ze znakami minusowymi, tak jak w systemie dziesiętnym.2. Przedstawicielstwo wewnętrzne
Wewnętrzna reprezentacja liczb jest zmiennoprzecinkowa 64-bitowa i niektóre ograniczenia są omówione w tej odpowiedzi . Nie ma łatwego sposobu na utworzenie tego ciągu bitowego w javascript ani dostęp do określonych bitów.
3. Maski i operatory bitowe
MDN ma dobry przegląd działania operatorów bitowych. Co ważne:
Przed zastosowaniem operacji 64-bitowe liczby zmiennoprzecinkowe są rzutowane na 32-bitowe liczby całkowite ze znakiem. Po ich ponownej konwersji.
Oto przykładowy kod MDN do konwersji liczb na ciągi 32-bitowe.
źródło
Prostym sposobem jest po prostu ...
źródło
(42).toString(2)
42..toString(2)
1.
tak samo jak1.0
lub tylko1
(i podobnie możesz także pominąć część przed i pisać.5
zamiast0.5
). Tak więc w tym przykładzie pierwsza kropka jest separatorem dziesiętnym, który jest częścią liczby, a druga kropka jest operatorem kropki służącym do wywołania metody na tym numerze. Musisz użyć dwóch kropek (lub owinąć liczbę w nawiasach) i nie możesz po prostu pisać,42.toString(2)
ponieważ parser widzi kropkę jako separator dziesiętny i zgłasza błąd z powodu braku operatora kropki.Ta odpowiedź próbuje adresować dane wejściowe o wartości bezwzględnej w zakresie 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1).
W JavaScript liczby są przechowywane w 64-bitowej reprezentacji zmiennoprzecinkowej , ale operacje bitowe zmuszają je do 32-bitowych liczb całkowitych w formacie uzupełnienia do dwóch , więc każde podejście wykorzystujące operacje bitowe ogranicza zakres wyniku do -2147483648 10 (-2 31 ) - 2147483647 10 (2 31 -1).
Jeśli jednak uniknie się operacji bitowych, a 64-bitowa reprezentacja zmiennoprzecinkowa zostanie zachowana przy użyciu tylko operacji matematycznych, możemy niezawodnie przekonwertować dowolną bezpieczną liczbę całkowitą na 64-bitową dopełniającą notację binarną z dopełnieniem 53-bitowego znaku
twosComplement
:W starszych przeglądarkach istnieją wielopełniacze następujących funkcji i wartości:
Number.isSafeInteger()
Number.isInteger()
Number.MAX_SAFE_INTEGER
String.prototype.padStart()
Jako dodatkowy bonus możesz wesprzeć dowolny podstawnik (2–36), jeśli wykonasz konwersję uzupełnienia dwóch liczb ujemnych w liczbach ⌈64 / log 2 (podstawa) ⌉ przy użyciu
BigInt
:Jeśli jesteś zainteresowany moją starą odpowiedzią, która posłużyła
ArrayBuffer
do utworzenia związku między a,Float64Array
aUint16Array
zapoznaj się z historią wersji tej odpowiedzi .źródło
-(2**53)-1
celu2**53-1
, a nie tylko-(2**31)
do2**31-1
jak odpowiedź Annana.Rozwiązaniem, które wybrałbym w porządku dla 32-bitów, jest kod na końcu tej odpowiedzi, który pochodzi z developer.mozilla.org (MDN), ale z pewnymi wierszami dodanymi do A) formatowania i B) sprawdzania, czy liczba jest w zakresie.
Niektórzy sugerowali
x.toString(2)
że nie działa na negatywy, po prostu umieszcza tam znak minus, co nie jest dobre.Fernando wspomniał o prostym rozwiązaniu
(x>>>0).toString(2);
które jest odpowiednie dla negatywów, ale ma niewielki problem, gdy x jest dodatnie. Ma wyjście zaczynające się od 1, co dla liczb dodatnich nie jest właściwym uzupełnieniem 2s.Każdy, kto nie rozumie faktu, że liczby dodatnie zaczynają się od 0 i liczby ujemne z 1, w uzupełnieniu 2s, może sprawdzić tę SO QnA w uzupełnieniu 2s. Co to jest „Uzupełnienie 2”?
Rozwiązaniem mogłoby być wcześniejsze wpisanie 0 dla liczb dodatnich, co zrobiłem we wcześniejszej wersji tej odpowiedzi. Czasami można zaakceptować liczbę 33-bitową lub upewnić się, że liczba do konwersji mieści się w zakresie - (2 ^ 31) <= x <2 ^ 31-1. Tak więc liczba wynosi zawsze 32 bity. Ale zamiast tego możesz skorzystać z tego rozwiązania na mozilla.org
Odpowiedź i kod Patryka jest długi i najwyraźniej działa na 64-bit, ale miał błąd znaleziony przez komentatora, a komentator naprawił błąd patryka, ale patrick ma w swoim kodzie „magiczną liczbę”, o której nie skomentował i zapomniany i Patrick nie rozumie już w pełni własnego kodu / dlaczego on działa.
Annan miał niepoprawną i niejasną terminologię, ale wspomniał o rozwiązaniu autorstwa developer.mozilla.org https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators Działa to dla liczb 32-bitowych.
Kod jest dość kompaktowy, funkcja trzech wierszy.
Ale dodałem wyrażenie regularne, aby sformatować dane wyjściowe w grupach po 8 bitów. Oparty na tym, jak wydrukować liczbę z przecinkami jako tysiące separatorów w JavaScript (właśnie zmieniłem ją od zgrupowania jej w 3s od prawej do lewej i dodawania przecinków , do grupowania w 8s od prawej do lewej i dodania spacji )
I chociaż Mozilla skomentowała rozmiar nMaski (liczby wprowadzonej) .. że musi on znajdować się w zakresie, nie testowali ani nie zgłaszali błędu, gdy liczba jest poza zakresem, więc mam dodał to.
Nie jestem pewien, dlaczego nazwali swój parametr „nMask”, ale pozostawię to bez zmian.
Odniesienie: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
źródło
Możesz napisać własną funkcję, która zwraca tablicę bitów. Przykład jak przekonwertować liczbę na bity
Dzielnik | Dywidenda | bity / reszta
2 | 9 | 1
2 | 4 | 0
2 | 2 | 0
~ | 1 | ~
przykład powyższej linii: 2 * 4 = 8, a reszta to 1, więc 9 = 1 0 0 1
Czytaj resztki od dołu do góry. Cyfra 1 od środka do góry.
źródło
Math.floor(number%2)
zamiast tegonumber = Math.floor(number/2)
?Użyłem innego podejścia, aby wymyślić coś, co to robi. Zdecydowałem się nie używać tego kodu w moim projekcie, ale pomyślałem, że zostawię go gdzieś istotnym na wypadek, gdyby był przydatny dla kogoś.
źródło
Jeszcze jedna alternatywa
źródło
To jest mój kod:
źródło
To jest rozwiązanie. Jest to dość proste
źródło