Так как битовые операции отбрасывают десятичную часть, то их можно использовать для округления. Достаточно взять любую операцию, которая не меняет значение числа.
Например, двойное НЕ (~):
alert( ~~12.345 ); // 12
Подойдёт и Исключающее ИЛИ (^) с нулём:
alert( 12.345^0 ); // 12
Последнее даже более удобно, поскольку отлично читается:
alert( 12.3 * 14.5 ^ 0); // (=178) "12.3 умножить на 14.5 и округлить"
У побитовых операторов достаточно низкий приоритет, он меньше чем у остальной арифметики:
Внутренний формат чисел устроен так, что для смены знака нужно все биты заменить на противоположные («обратить») и прибавить 1.
Обращение битов — это побитовое НЕ (~). То есть, при таком формате представления числа -n = ~n + 1. Или, если перенести единицу: ~n = -(n+1).
Как видно из последнего равенства, ~n == 0 только если n == -1. Поэтому можно легко проверить равенство n == -1:
var n = 5;
if (~n) { // сработает, т.к. ~n = -(5+1) = -6
alert("n не -1"); // выведет!
}
var n = -1;
if (~n) { // не сработает, т.к. ~n = -(-1+1) = 0
alert("....ничего не выведет...");
}
Проверка на -1 пригождается, например, при поиске символа в строке. Вызов str.indexOf("подстрока") возвращает позицию подстроки в str, или -1 если не нашёл.
var str = "Проверка";
if (~str.indexOf("верка")) { // Сочетание "if (~...indexOf)" читается как "если найдено"