按位运算符

请注意,所有按位操作都是通过将任何操作数传递给内部函数 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