按位運算子

按位運算子對資料的位值執行操作。這些運算子將運算元符號的 32 位整數的二進位制補碼

轉換為 32 位整數

超過 32 位的數字會丟棄其最高有效位。例如,以下超過 32 位的整數將轉換為 32 位整數:

Before: 10100110111110100000000010000011110001000001
After:              10100000000010000011110001000001

二進位制的補充

在正常二進位制中,我們通過將 1 基於它們的位置作為 2 的冪來新增二進位制值 - 最右邊的位是 2^0 到最左邊的位是 2^n-1,其中 n 是位數。例如,使用 4 位:

// Normal Binary
// 8 4 2 1
   0 1 1 0  => 0 + 4 + 2 + 0 => 6

兩個補碼的格式意味著數字的負對應(6 對 -6)是倒數的所有位加 1。6 位的反轉位是:

// Normal binary
   0 1 1 0
// One's complement (all bits inverted)
   1 0 0 1  => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
   1 0 1 0  => -8 + 0 + 2 + 0 => -6

注意: 在二進位制數字的左側新增更多 1 並不會改變它在兩個恭維中的值。10101111111111010 的值都是 -6

按位 AND

按位 AND 操作 a & b 返回帶有 1 的二進位制值,其中兩個二進位制運算元在特定位置具有 1,而在所有其他位置具有 0。例如:

13 & 7 => 5
// 13:     0..01101
//  7:     0..00111
//-----------------
//  5:     0..00101 (0 + 0 + 4 + 0 + 1)

真實世界的例子:數字的奇偶校驗

這不是個傑作(不幸的是在很多真正的程式碼部分經常看到):

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!");
}

按位 OR

按位 OR 運算 a | b 返回帶有 1 的二進位制值,其中運算元或兩個運算元在特定位置具有 1,而當兩個值在某個位置具有 00。例如:

13 | 7 => 15
// 13:     0..01101
//  7:     0..00111
//-----------------
// 15:     0..01111 (0 + 8 + 4 + 2 + 1)  

按位 NOT

按位 NOT 操作~a 翻轉給定值 a 的位。這意味著所有的 1 將成為 0 的所有 0 將成為 1 的。

~13 => -14
// 13:     0..01101
//-----------------
//-14:     1..10010 (-16 + 0 + 0 + 2 + 0)

按位異或

按位 XOR( 異或 )操作 a ^ b 僅在兩個位不同時才放置 1。排他性或意味著一種或另一種,但不是兩種

13 ^ 7 => 10
// 13:     0..01101
//  7:     0..00111
//-----------------
// 10:     0..01010  (0 + 8 + 0 + 2 + 0)

真實世界的例子:交換兩個整數值而無需額外的記憶體分配

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