Ich habe heute eine Online-Bibliothek für Spielphysik ausgecheckt und bin auf den Operator ~~ gestoßen. Ich weiß, dass ein einzelnes ~ ein bitweises NICHT ist. Würde das ~~ zu einem NICHT eines NICHT machen, das den gleichen Wert zurückgeben würde, nicht wahr?
javascript
Shane Tomlinson
quelle
quelle
Antworten:
Es wird alles nach dem Dezimalpunkt entfernt, da die bitweisen Operatoren ihre Operanden implizit in vorzeichenbehaftete 32-Bit-Ganzzahlen konvertieren. Dies funktioniert unabhängig davon, ob die Operanden (Gleitkomma-) Zahlen oder Zeichenfolgen sind und das Ergebnis eine Zahl ist.
Mit anderen Worten, es ergibt sich:
Nur wenn x zwischen - (2 31 ) und 2 31 - 1 liegt. Andernfalls tritt ein Überlauf auf und die Zahl wird "umbrochen".
Dies kann als nützlich angesehen werden, um das String-Argument einer Funktion in eine Zahl umzuwandeln, aber sowohl wegen der Möglichkeit eines Überlaufs als auch weil es für die Verwendung mit Nicht-Ganzzahlen falsch ist, würde ich es nicht so verwenden, außer für "Code Golf" ( dh sinnloses Abschneiden von Bytes aus dem Quellcode Ihres Programms auf Kosten der Lesbarkeit und Robustheit). Ich würde
+x
oderNumber(x)
stattdessen verwenden.Wie das das NICHT des NICHT ist
Die Nummer -43.2 lautet zum Beispiel:
als vorzeichenbehaftete 32-Bit-Binärzahl (Zweierkomplement). (JavaScript ignoriert, was nach dem Dezimalpunkt steht.) Das Invertieren der Bits ergibt:
Wieder invertieren ergibt:
Dies unterscheidet sich davon,
Math.floor(-43.2)
dass negative Zahlen gegen Null gerundet werden und nicht davon entfernt sind. (Die Floor-Funktion, die gleich -44 wäre, rundet immer auf die nächstniedrigere Ganzzahl ab, unabhängig davon, ob die Zahl positiv oder negativ ist.)quelle
~~
ist eine Kurzform (und möglicherweise eine gute Lösung?), Um eine abgeschnittene Funktion zu erstellen , aber offensichtlich in Javascript .~~
.Der erste ~ -Operator erzwingt den Operanden in eine Ganzzahl (möglicherweise nachdem der Wert in einen String oder einen Booleschen Wert gezwungen wurde) und invertiert dann die niedrigsten 31 Bits. Offiziell sind ECMAScript-Zahlen alle Gleitkommazahlen, aber einige Zahlen sind in der SpiderMonkey-Engine als 31-Bit-Ganzzahlen implementiert.
Sie können es verwenden, um ein 1-Element-Array in eine Ganzzahl umzuwandeln. Gleitkommawerte werden nach der C-Regel konvertiert, d. H. Abschneiden des Bruchteils.
Der zweite ~ -Operator invertiert dann die Bits zurück, sodass Sie wissen, dass Sie eine Ganzzahl haben. Dies ist nicht dasselbe wie das Erzwingen eines booleschen Werts in einer Bedingungsanweisung, da ein leeres Objekt {} als wahr ausgewertet wird, während ~~ {} als falsch ausgewertet wird.
quelle
~~undefined // 0
~~null // 0
~
macht das, was Sie beschrieben haben, der erste~
macht und umgekehrt. Der~
Operator ist ein unärer Operator und wird von rechts nach links~~X
~(~X)
(~~)X
In ECMAScript 6, das Äquivalents
~~
ist Math.trunc :Die Polyfüllung:
quelle
Das
~
scheint zu tun-(N+1)
. So~2 == -(2 + 1) == -3
Wenn Sie es wieder auf -3 es wird es wieder:~-3 == -(-3 + 1) == 2
Es wahrscheinlich wandelt nur einen String in eine Zahl in einem Umweg.Siehe diesen Thread: http://www.sitepoint.com/forums/showthread.php?t=663275
Weitere Informationen finden Sie hier: http://dreaminginjavascript.wordpress.com/2008/07/04/28/
quelle
Gegeben
~N
ist-(N+1)
,~~N
ist dann-(-(N+1) + 1)
. Was offensichtlich zu einem ordentlichen Trick führt .quelle
Nur eine kleine Warnung. Die anderen Antworten hier haben mich in Schwierigkeiten gebracht.
Die Absicht ist, alles nach dem Dezimalpunkt einer Gleitkommazahl zu entfernen, aber es gibt einige Eckfälle, die es zu einer Fehlergefahr machen. Ich würde empfehlen, ~~ zu vermeiden.
Erstens funktioniert ~~ bei sehr großen Zahlen nicht.
~~1000000000000 == -727279968
Alternativ können Sie verwenden
Math.trunc()
(wie Gajus erwähnt hat,Math.trunc()
gibt den ganzzahligen Teil einer Gleitkommazahl zurück, ist jedoch nur in ECMAScript 6-kompatiblem JavaScript verfügbar). Sie können jederzeit Ihre eigenenMath.trunc()
Umgebungen für Nicht-ECMAScript-6-Umgebungen erstellen, indem Sie Folgendes tun:Ich habe dazu einen Blog-Beitrag als Referenz geschrieben: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html
quelle
Hier ist ein Beispiel dafür, wie dieser Operator effizient verwendet werden kann, wenn es sinnvoll ist, ihn zu verwenden:
Quelle:
Siehe Abschnitt Interaktion mit Punkten
quelle
Konvertieren von Zeichenfolgen in Zahlen
~ -1 ist 0
Quelle
quelle
Tilde (~) hat einen Algorithmus - (N + 1)
Zum Beispiel:
Doppelte Tilde ist - (- (N + 1) +1)
Beispielsweise:
Dreifache Tilde ist - (- (- (N + 1) +1) +1)
Beispielsweise:
quelle