Estaba revisando una biblioteca de física de juegos en línea hoy y me encontré con el operador ~~. Sé que un solo ~ es un NO bit a bit, ¿eso haría que ~~ sea un NOT de un NOT, lo que devolvería el mismo valor, ¿no?
javascript
Shane Tomlinson
fuente
fuente
Respuestas:
Elimina todo después del punto decimal porque los operadores bit a bit convierten implícitamente sus operandos en enteros de 32 bits con signo. Esto funciona si los operandos son números o cadenas (de punto flotante) y el resultado es un número.
En otras palabras, produce:
solo si x está entre - (2 31 ) y 2 31 - 1. De lo contrario, se producirá un desbordamiento y el número se "envolverá".
Esto puede considerarse útil para convertir el argumento de cadena de una función en un número, pero tanto por la posibilidad de desbordamiento como por el hecho de que es incorrecto para usar con números no enteros, no lo usaría de esa manera, excepto para "golf de código" ( es decir recortar bytes sin sentido del código fuente de su programa a expensas de la legibilidad y robustez). Yo usaría
+x
o en suNumber(x)
lugar.Cómo este es el NO del NO
El número -43.2, por ejemplo es:
como un número binario de 32 bits con signo (complemento de dos). (JavaScript ignora lo que está después del punto decimal.) Invertir los bits da:
Invertir nuevamente da:
Esto difiere de
Math.floor(-43.2)
que los números negativos se redondean hacia cero, no lejos de él. (La función de piso, que sería igual a -44, siempre se redondea al siguiente entero más bajo, independientemente de si el número es positivo o negativo).fuente
~~
es una forma abreviada (y posiblemente una buena solución) para crear una función truncada , pero obviamente en JavaScript .~~
.El primer operador ~ fuerza el operando a un número entero (posiblemente después de forzar el valor a una cadena o un booleano), luego invierte los 31 bits más bajos. Oficialmente, los números de ECMAScript son todos de punto flotante, pero algunos números se implementan como enteros de 31 bits en el motor SpiderMonkey.
Puede usarlo para convertir una matriz de 1 elemento en un entero. Los puntos flotantes se convierten de acuerdo con la regla C, es decir. truncamiento de la parte fraccional.
El segundo operador ~ luego invierte los bits, para que sepa que tendrá un número entero. Esto no es lo mismo que coaccionar un valor a booleano en una declaración de condición, porque un objeto vacío {} se evalúa como verdadero, mientras que ~~ {} se evalúa como falso.
fuente
~~undefined // 0
~~null // 0
~
hace lo que usted describió~
, y viceversa. El~
operador es un operador unario y está interperado de derecha a izquierda~~X
es como~(~X)
no(~~)X
(lo que sería un error de sintaxis)En ECMAScript 6, el equivalente de
~~
es Math.trunc :El polyfill:
fuente
El
~
parece hacer-(N+1)
. Entonces,~2 == -(2 + 1) == -3
si lo vuelve a hacer en -3, lo devuelve:~-3 == -(-3 + 1) == 2
probablemente solo convierte una cadena en un número de forma redondeada.Vea este hilo: http://www.sitepoint.com/forums/showthread.php?t=663275
Además, hay información más detallada disponible aquí: http://dreaminginjavascript.wordpress.com/2008/07/04/28/
fuente
Dado
~N
es-(N+1)
,~~N
es entonces-(-(N+1) + 1)
. Lo que, evidentemente, lleva a un buen truco .fuente
Solo un poco de advertencia. Las otras respuestas aquí me metieron en problemas.
La intención es eliminar cualquier cosa después del punto decimal de un número de coma flotante, pero tiene algunos casos de esquina que lo convierten en un peligro de error. Recomiendo evitar ~~.
Primero, ~~ no funciona en números muy grandes.
~~1000000000000 == -727279968
Como alternativa, use
Math.trunc()
(como mencionó Gajus,Math.trunc()
devuelve la parte entera de un número de coma flotante pero solo está disponible en JavaScript compatible con ECMAScript 6). Siempre puede hacer lo suyoMath.trunc()
para entornos que no sean ECMAScript-6 haciendo esto:Escribí una publicación de blog sobre esto para referencia: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html
fuente
Aquí hay un ejemplo de cómo este operador se puede usar de manera eficiente, donde tiene sentido usarlo:
Fuente:
Ver sección Interactuar con puntos
fuente
Convertir cadenas a números
~ -1 es 0
fuente
fuente
Tilde (~) tiene un algoritmo - (N + 1)
Por ejemplo:
La tilde doble es - (- (N + 1) +1)
Por ejemplo:
La tilde triple es - (- (- (N + 1) +1) +1)
Por ejemplo:
fuente