按位運算子
請注意,所有按位操作都是通過將任何運算元傳遞給內部函式 ToInt32 來對 32 位整數進行操作。
按位或
var a;
a = 0b0011 | 0b1010; // a === 0b1011
// truth table
// 1010 | (or)
// 0011
// 1011 (result)
按位和
a = 0b0011 & 0b1010; // a === 0b0010
// truth table
// 1010 & (and)
// 0011
// 0010 (result)
按位不是
a = ~0b0011; // a === 0b1100
// truth table
// 10 ~(not)
// 01 (result)
按位 xor (獨佔或)
a = 0b1010 ^ 0b0011; // a === 0b1001
// truth table
// 1010 ^ (xor)
// 0011
// 1001 (result)
按位左移
a = 0b0001 << 1; // a === 0b0010
a = 0b0001 << 2; // a === 0b0100
a = 0b0001 << 3; // a === 0b1000
左移相當於整數乘以 Math.pow(2, n)
。在進行整數運算時,shift 可以顯著提高某些數學運算的速度。
var n = 2;
var a = 5.4;
var result = (a << n) === Math.floor(a) * Math.pow(2,n);
// result is true
a = 5.4 << n; // 20
按位右移 >>
(符號傳播移位)>>>
(零填充右移)
a = 0b1001 >> 1; // a === 0b0100
a = 0b1001 >> 2; // a === 0b0010
a = 0b1001 >> 3; // a === 0b0001
a = 0b1001 >>> 1; // a === 0b0100
a = 0b1001 >>> 2; // a === 0b0010
a = 0b1001 >>> 3; // a === 0b0001
負 32 位值總是最左邊的位:
a = 0b11111111111111111111111111110111 | 0;
console.log(a); // -9
b = a >> 2; // leftmost bit is shifted 1 to the right then new left most bit is set to on (1)
console.log(b); // -3
b = a >>> 2; // leftmost bit is shifted 1 to the right. the new left most bit is set to off (0)
console.log(b); // 2147483643
>>>
操作的結果總是積極的。
>>
的結果始終與移位值的符號相同。
正數的右移相當於除以 Math.pow(2,n)
和地板結果:
a = 256.67;
n = 4;
result = (a >> n) === Math.floor( Math.floor(a) / Math.pow(2,n) );
// result is true
a = a >> n; // 16
result = (a >>> n) === Math.floor( Math.floor(a) / Math.pow(2,n) );
// result is true
a = a >>> n; // 16
負數上的右移零填充(>>>
)是不同的。由於 JavaScript 在執行位操作時不會轉換為無符號整數,因此沒有操作等效:
a = -256.67;
result = (a >>> n) === Math.floor( Math.floor(a) / Math.pow(2,n) );
// result is false
按位賦值運算子
除了 not(~
)之外,所有上述位運算子都可以用作賦值運算子:
a |= b; // same as: a = a | b;
a ^= b; // same as: a = a ^ b;
a &= b; // same as: a = a & b;
a >>= b; // same as: a = a >> b;
a >>>= b; // same as: a = a >>> b;
a <<= b; // same as: a = a << b;
警告 :Javascript 使用 Big Endian 儲存整數。這並不總是與裝置/ OS 的 Endian 匹配。當使用位長大於 8 位的型別化陣列時,應在應用按位運算之前檢查環境是 Little Endian 還是 Big Endian。
警告 :位運算子,如 &
和|
是不一樣的邏輯運算子 &&
(和) 和 ||
(或) 。如果用作邏輯運算子,它們將提供不正確的結果。的操作者^
是不將功率操作者( 一 b ) 。