Он удаляет все после десятичной точки, потому что побитовые операторы неявно преобразуют свои операнды в 32-разрядные целые числа со знаком. Это работает независимо от того, являются ли операнды числами (или числами с плавающей точкой), и результатом является число.
Другими словами, это дает:
function(x) {
if(x < 0) return Math.ceil(x);
else return Math.floor(x);
}
только в том случае, если x находится между - (2 31 ) и 2 31 - 1. В противном случае произойдет переполнение, и число будет "округлено" .
Это может считаться полезным для преобразования строкового аргумента функции в число, но как из-за возможности переполнения, так и из-за того, что оно некорректно для использования с нецелыми числами, я бы не использовал его таким образом, за исключением «кода гольфа» "( т.е. бессмысленно обрезает байты исходного кода вашей программы за счет читабельности и надежности). Я бы использовал +x
или Number(x)
вместо.
Как это НЕ из НЕ
Число -43,2, например:
-43,2 10 = 11111111111111111111111111010101 2
как 32-разрядное двоичное число со знаком (дополнение к двум). (JavaScript игнорирует то, что находится после десятичной точки.) Инвертирование битов дает:
НЕ -43 10 = 00000000000000000000000000101010 2 = 42 10
Инвертирование снова дает:
НЕ 42 10 = 11111111111111111111111111010101 2 = -43 10
Это отличается от Math.floor(-43.2)
тем, что отрицательные числа округляются до нуля, а не от него. (Функция floor, которая будет равна -44, всегда округляется до следующего нижнего целого числа, независимо от того, является ли число положительным или отрицательным.)