Hoje eu estava checando uma biblioteca de física de jogos online e me deparei com o operador ~~. Eu sei que um único ~ é um NÃO bit a bit, isso tornaria ~~ um NÃO de um NÃO, o que daria o mesmo valor, não é?
javascript
Shane Tomlinson
fonte
fonte
Respostas:
Ele remove tudo após o ponto decimal porque os operadores bit a bit implicitamente convertem seus operandos em números inteiros de 32 bits assinados. Isso funciona se os operandos são números ou cadeias (ponto flutuante) e o resultado é um número.
Em outras palavras, produz:
somente se x estiver entre - (2 31 ) e 2 31 - 1. Caso contrário, ocorrerá um estouro e o número será "contornado".
Isso pode ser considerado útil para converter o argumento de seqüência de caracteres de uma função em um número, mas, devido à possibilidade de estouro e por estar incorreto para uso com números não inteiros, eu não o usaria dessa maneira, exceto para "code golf" ( ou seja, cortar inutilmente os bytes do código-fonte do seu programa em detrimento da legibilidade e robustez). Eu usaria
+x
ouNumber(x)
não.Como esse é o NÃO do NÃO
O número -43,2, por exemplo, é:
como um número binário de 32 bits assinado (complemento de dois). (JavaScript ignora o que está depois do ponto decimal.) A inversão dos bits fornece:
A inversão novamente fornece:
Isso difere de
Math.floor(-43.2)
que os números negativos são arredondados para zero, não para longe dele. (A função de piso, que seria igual a -44, sempre arredonda para o próximo número inteiro inferior, independentemente de o número ser positivo ou negativo.)fonte
~~
é uma maneira abreviada (e possivelmente uma boa solução?) Para criar uma função truncada , mas obviamente em javascript .~~
.O primeiro operador ~ força o operando a um número inteiro (possivelmente após coagir o valor a uma string ou a um valor booleano) e depois inverte os 31 bits mais baixos. Oficialmente, os números do ECMAScript são todos de ponto flutuante, mas alguns são implementados como números inteiros de 31 bits no mecanismo SpiderMonkey.
Você pode usá-lo para transformar uma matriz de 1 elemento em um número inteiro. Os pontos flutuantes são convertidos de acordo com a regra C, ie. truncamento da parte fracionária.
O segundo operador ~ inverte os bits de volta, para que você saiba que terá um número inteiro. Isso não é o mesmo que coagir um valor para booleano em uma declaração de condição, porque um objeto vazio {} é avaliado como verdadeiro, enquanto ~~ {} é avaliado como falso.
fonte
~~undefined // 0
~~null // 0
~
faz o que você descreveu o primeiro~
e vice-versa. O~
operador é um operador unário e é interoperado da direita para a esquerda~~X
e~(~X)
não como(~~)X
(o que seria um erro de sintaxe)No ECMAScript 6, o equivalente a
~~
é Math.trunc :O polyfill:
fonte
O que
~
parece fazer-(N+1)
. Portanto,~2 == -(2 + 1) == -3
se você fizer novamente com -3, ele voltará:~-3 == -(-3 + 1) == 2
provavelmente converte uma string em um número de maneira arredondada.Consulte este tópico: http://www.sitepoint.com/forums/showthread.php?t=663275
Além disso, informações mais detalhadas estão disponíveis aqui: http://dreaminginjavascript.wordpress.com/2008/07/04/28/
fonte
Dado
~N
é-(N+1)
,~~N
é então-(-(N+1) + 1)
. O que, evidentemente, leva a um truque legal .fonte
Apenas um aviso. As outras respostas aqui me causaram alguns problemas.
A intenção é remover qualquer coisa após o ponto decimal de um número de ponto flutuante, mas há alguns casos de canto que o tornam um risco de bug. Eu recomendo evitar ~~.
Primeiro, o ~~ não funciona em números muito grandes.
~~1000000000000 == -727279968
Como alternativa, use
Math.trunc()
(como Gajus mencionou,Math.trunc()
retorna a parte inteira de um número de ponto flutuante, mas só está disponível no JavaScript compatível com ECMAScript 6). Você sempre pode criar seus próprios ambientesMath.trunc()
não-ECMAScript-6 fazendo o seguinte:Eu escrevi um post sobre isso para referência: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html
fonte
Aqui está um exemplo de como esse operador pode ser usado com eficiência, onde faz sentido usá-lo:
Fonte:
Consulte a seção Interagindo com pontos
fonte
Convertendo seqüências de caracteres em números
~ -1 é 0
fonte
fonte
Tilde (~) tem um algorihm - (N + 1)
Por exemplo:
O til duplo é - (- (N + 1) +1)
Por exemplo:
O til triplo é - (- (- (N + 1) +1) +1)
Por exemplo:
fonte