Szukaj…


Wykrywanie parzystości liczb za pomocą bitowego AND

Zamiast tego (niestety zbyt często spotykanego w prawdziwym kodzie) „arcydzieło”:

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

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

Możesz wykonać kontrolę parzystości o wiele bardziej skuteczny i prosty:

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

(dotyczy to nie tylko JavaScript)

Zamiana dwóch liczb całkowitych na Bitwise XOR (bez dodatkowego przydziału pamięci)

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

Szybsze mnożenie lub dzielenie przez potęgi 2

Przesunięcie bitów w lewo (w prawo) jest równoznaczne z pomnożeniem (podzieleniem) przez 2. To samo w bazie 10: jeśli „przesuniemy w lewo” 13 o 2 miejsca, otrzymamy 1300 lub 13 * (10 ** 2) . A jeśli weźmiemy 12345 i „przesuniemy w prawo” o 3 miejsca, a następnie usuniemy część dziesiętną, otrzymamy 12 lub Math.floor(12345 / (10 ** 3)) . Więc jeśli chcemy pomnożyć zmienną przez 2 ** n , możemy po prostu przesunąć w lewo o n bitów.

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

Podobnie, aby wykonać (zmiennoprzecinkowe) dzielenie liczb całkowitych przez 2 ** n , możemy przesunąć w prawo o n bitów. Przykład:

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

Działa nawet z liczbami ujemnymi:

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

W rzeczywistości szybkość arytmetyki raczej nie wpłynie znacząco na czas działania kodu, chyba że wykonujesz to na setkach milionów obliczeń. Ale programiści C uwielbiają takie rzeczy!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow