按位運算子
按位運算子對資料的位值執行操作。這些運算子將運算元符號的 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
並不會改變它在兩個恭維中的值。1010
和 1111111111010
的值都是 -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
,而當兩個值在某個位置具有 0
時 0
。例如:
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