Поиск…


Обнаружение четности числа с побитовым И

Вместо этого (к сожалению, слишком часто наблюдается в реальном коде) «шедевр»:

function isEven(n) {
    return n % 2 == 0;
}

function isOdd(n) {
    if (isEven(n)) {
        return false;
    } else {
        return true;
    }
}

Вы можете сделать проверку паритета намного более эффективной и простой:

if(n & 1) {
    console.log("ODD!");
} else {
    console.log("EVEN!");
}

(это действительно справедливо не только для JavaScript)

Переключение двух целых чисел с побитовым XOR (без дополнительного выделения памяти)

var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11

Более быстрое умножение или деление по степеням 2

Перемещение битов влево (вправо) эквивалентно умножению (делению) на 2. Это то же самое в базе 10: если мы «сдвинем левый» 13 на 2 места, получаем 1300 , или 13 * (10 ** 2) . И если мы возьмем 12345 и «правый сдвиг» на 3 места, а затем удалим десятичную часть, получим 12 или Math.floor(12345 / (10 ** 3)) . Поэтому, если мы хотим умножить переменную на 2 ** n , мы можем просто сдвинутьлево на n бит.

console.log(13 * (2 ** 6)) //13 * 64 = 832
console.log(13    <<   6)  //          832

Точно так же, чтобы сделать (настил) целочисленное деление на 2 ** n , мы можем сдвиг вправо на n бит. Пример:

console.log(1000 / (2 ** 4)) //1000 / 16 = 62.5
console.log(1000    >>   4)  //            62

Он работает даже с отрицательными номерами:

console.log(-80 / (2 ** 3)) //-80 / 8 = -10
console.log(-80      >> 3)  //          -10

На самом деле, скорость арифметики вряд ли существенно повлияет на то, как долго ваш код будет работать, если вы не делаете порядка 100 миллионов миллионов вычислений. Но программистам C нравятся такие вещи!



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow