Sprawdzałem dziś bibliotekę fizyki gier online i natknąłem się na operatora ~~. Wiem, że singiel ~ jest trochę NIE, czy to by uczyniło ~ NIE NIE, co dałoby tę samą wartość, prawda?
javascript
Shane Tomlinson
źródło
źródło
Odpowiedzi:
Usuwa wszystko po przecinku, ponieważ operatory bitowe domyślnie konwertują swoje operandy na 32-bitowe liczby całkowite ze znakiem. Działa to niezależnie od tego, czy operandy są liczbami zmiennoprzecinkowymi, czy ciągami, a wynikiem jest liczba.
Innymi słowy, daje:
tylko jeśli x jest między - (2 31 ) a 2 31 - 1. W przeciwnym razie nastąpi przepełnienie i liczba „zawinie się”.
Może to być uznane za przydatne do konwersji argumentu ciągu funkcji na liczbę, ale zarówno z powodu możliwości przepełnienia, jak i tego, że jest niepoprawny do użycia z liczbami innymi niż całkowite, nie użyłbym go w ten sposób, z wyjątkiem „kodu golfa” ( tj. bezcelowe przycinanie bajtów kodu źródłowego programu kosztem czytelności i niezawodności). Chciałbym użyć
+x
lubNumber(x)
zamiast.Jak to NIE jest NIE
Na przykład liczba -43.2 to:
w postaci 32-bitowej liczby binarnej ze znakiem (uzupełnienie dwóch). (JavaScript ignoruje to, co jest po przecinku). Odwrócenie bitów daje:
Ponowne odwrócenie daje:
Różni się to
Math.floor(-43.2)
tym, że liczby ujemne są zaokrąglane w kierunku zera, a nie od niego. (Funkcja floor, która byłaby równa -44, zawsze zaokrągla w dół do następnej niższej liczby całkowitej, niezależnie od tego, czy liczba jest dodatnia czy ujemna.)źródło
~~
jest to skrótowy sposób (i być może dobre rozwiązanie?) Do tworzenia funkcji obcinania , ale oczywiście w javascript .~~
.Pierwszy operator ~ wymusza operand na liczbę całkowitą (być może po wymuszeniu wartości na łańcuch lub wartość logiczną), a następnie odwraca najniższe 31 bitów. Oficjalnie wszystkie numery ECMAScript są zmiennoprzecinkowe, ale niektóre liczby są implementowane jako 31-bitowe liczby całkowite w silniku SpiderMonkey.
Możesz go użyć do przekształcenia tablicy 1-elementowej w liczbę całkowitą. Punkty zmiennoprzecinkowe są konwertowane zgodnie z regułą C, tj. obcięcie części ułamkowej.
Drugi operator ~ następnie odwraca bity z powrotem, więc wiesz, że będziesz miał liczbę całkowitą. To nie jest to samo, co wymuszanie wartości logicznej w instrukcji warunku, ponieważ pusty obiekt {} ma wartość true, podczas gdy ~~ {} ma wartość false.
źródło
~~undefined // 0
~~null // 0
~
robi to, co opisałeś pierwszy~
robi i na odwrót.~
Operator jest jednoskładnikowa, operatorzy i interpereted od prawej do lewej~~X
jest jak~(~X)
nie jak(~~)X
(co byłoby błąd składni)W ECMAScript 6 odpowiednikiem
~~
jest Math.trunc :Polyfill:
źródło
~
Wydaje się zrobić-(N+1)
. Więc~2 == -(2 + 1) == -3
jeśli zrobisz to ponownie na -3, to odwróci to:~-3 == -(-3 + 1) == 2
Prawdopodobnie po prostu przekształca ciąg znaków na liczbę w okrągły sposób.Zobacz ten wątek: http://www.sitepoint.com/forums/showthread.php?t=663275
Bardziej szczegółowe informacje są również dostępne tutaj: http://dreaminginjavascript.wordpress.com/2008/07/04/28/
źródło
Biorąc pod uwagę,
~N
znaczy-(N+1)
,~~N
to potem-(-(N+1) + 1)
. Co oczywiście prowadzi do zgrabnej sztuczki .źródło
Tylko trochę ostrzeżenia. Inne odpowiedzi tutaj wpędziły mnie w kłopoty.
Ma to na celu usunięcie czegokolwiek po przecinku liczby zmiennoprzecinkowej, ale ma kilka przypadków narożnych, które sprawiają, że jest to ryzyko błędu. Polecam unikanie ~~.
Po pierwsze ~~ nie działa na bardzo dużych liczbach.
~~1000000000000 == -727279968
Alternatywnie, użyj
Math.trunc()
(jak wspomniano Gajus,Math.trunc()
zwraca całkowitą część liczby zmiennoprzecinkowej, ale jest dostępna tylko w JavaScript zgodnym z ECMAScript 6). Zawsze możesz stworzyć własneMath.trunc()
dla środowisk innych niż ECMAScript-6, wykonując następujące czynności:Napisałem blog na ten temat w celach informacyjnych: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html
źródło
Oto przykład, w jaki sposób można efektywnie korzystać z tego operatora, gdy jego użycie ma sens:
Źródło:
Zobacz rozdział Interakcja z punktami
źródło
Konwertowanie ciągów na liczby
~ -1 oznacza 0
źródło
źródło
Tylda (~) ma algorihm - (N + 1)
Na przykład:
Podwójna tylda to - (- (N + 1) +1)
Na przykład:
Potrójna tylda to - (- (- (N + 1) +1) +1)
Na przykład:
źródło