Сегодня я проверял библиотеку физики онлайн-игр и наткнулся на оператора ~~. Я знаю, что одно ~ является побитовым НЕ, разве это сделало бы ~~ НЕ НЕ, что вернуло бы то же значение, не так ли?
javascript
Шейн Томлинсон
источник
источник
Ответы:
Он удаляет все после десятичной точки, потому что побитовые операторы неявно преобразуют свои операнды в 32-разрядные целые числа со знаком. Это работает независимо от того, являются ли операнды числами или строками с плавающей запятой, а результат - числом.
Другими словами, это дает:
только если x находится между - (2 31 ) и 2 31 - 1. В противном случае произойдет переполнение, и число «обернется».
Это может считаться полезным для преобразования строкового аргумента функции в число, но как из-за возможности переполнения, так и из-за того, что оно некорректно для использования с нецелыми числами, я бы не использовал его таким образом, за исключением «кода гольфа» ( т.е. бессмысленно обрезать байты исходного кода вашей программы за счет читабельности и надежности). Я бы использовал
+x
илиNumber(x)
вместо.Как это НЕ из НЕ
Число -43.2, например:
как 32-разрядное двоичное число со знаком (дополнение к двум). (JavaScript игнорирует то, что находится после десятичной точки.) Инвертирование битов дает:
Инвертирование снова дает:
Это отличается от того,
Math.floor(-43.2)
что отрицательные числа округляются до нуля, а не от него. (Функция floor, которая будет равна -44, всегда округляется до следующего более низкого целого числа, независимо от того, является ли число положительным или отрицательным.)источник
~~
сокращенный способ (и, возможно, хорошее решение?) Для создания усеченной функции , но, очевидно, в javascript .~~
.Первый оператор ~ переводит операнд в целое число (возможно, после приведения значения к строке или логическому значению), затем инвертирует младшие 31 бит. Официально все числа ECMAScript представляют собой числа с плавающей точкой, но некоторые числа реализованы как 31-разрядные целые числа в движке SpiderMonkey.
Вы можете использовать его, чтобы превратить массив из 1 элемента в целое число. Плавающие точки конвертируются в соответствии с правилом C, т.е. усечение дробной части.
Затем второй оператор ~ инвертирует биты обратно, так что вы знаете, что у вас будет целое число. Это не то же самое, что приведение значения к логическому значению в операторе условия, потому что пустой объект {} оценивается как true, тогда как ~~ {} оценивается как false.
источник
~~undefined // 0
~~null // 0
~
делает то, что вы описали первый~
делает и наоборот.~
Оператор является унарными и interpereted справа налево~~X
, как~(~X)
не нравится(~~)X
(что было бы синтаксическую ошибку)В ECMAScript 6 эквивалентом
~~
является Math.trunc :Полифилл:
источник
~
, Кажется, делает-(N+1)
. Так что,~2 == -(2 + 1) == -3
если вы сделаете это снова на -3, это вернет его обратно:~-3 == -(-3 + 1) == 2
вероятно, он просто конвертирует строку в число в обратном порядке.Смотрите эту ветку: http://www.sitepoint.com/forums/showthread.php?t=663275
Также более подробная информация доступна здесь: http://dreaminginjavascript.wordpress.com/2008/07/04/28/
источник
Дано
~N
есть-(N+1)
,~~N
есть потом-(-(N+1) + 1)
. Что, очевидно, приводит к изящному трюку .источник
Просто предупреждение. Другие ответы привели меня в беду.
Намерение состоит в том, чтобы удалить что-либо после десятичной точки числа с плавающей запятой, но у него есть некоторые угловые случаи, которые делают это ошибкой. Я бы рекомендовал избегать ~~.
Во-первых, ~~ не работает с очень большими числами.
~~1000000000000 == -727279968
В качестве альтернативы используйте
Math.trunc()
(как упоминал Gajus,Math.trunc()
возвращает целую часть числа с плавающей запятой, но доступно только в JavaScript, совместимом с ECMAScript 6). Вы всегда можете сделать свой собственныйMath.trunc()
для не-ECMAScript-6 сред, выполнив это:Я написал сообщение в блоге об этом для справки: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html
источник
Вот пример того, как этот оператор может использоваться эффективно, где имеет смысл использовать его:
Источник:
Смотрите раздел Взаимодействие с точками
источник
Преобразование строк в числа
~ -1 равно 0
источник
источник
Тильда (~) имеет алгоритм - (N + 1)
Например:
Двойная тильда это - (- (N + 1) +1)
Например:
Тройная тильда - - (- (- (N + 1) +1) +1)
Например:
источник