请注意,所有按位运算都是通过将任何操作数传递给内部函数ToInt32来对32位整数进行运算的。
var a; a = 0b0011 | 0b1010; // a === 0b1011 // 真值表 //1010 | (要么) // 0011 // 1011(结果)
a = 0b0011 & 0b1010; // a === 0b0010 // 真值表 // 1010 & (and) // 0011 // 0010(结果)
a = ~0b0011; // 一个=== 0b1100 // 真值表 // 10〜(不) // 01(结果)
a = 0b1010 ^ 0b0011; // a === 0b1001 // 真值表 // 1010 ^(异或) // 0011 // 1001(结果)
a = 0b0001 << 1; // a === 0b0010 a = 0b0001 << 2; // a === 0b0100 a = 0b0001 << 3; // a === 0b1000
左移等效于整数乘以Math.pow(2, n)。在进行整数数学运算时,移位可以显着提高某些数学运算的速度。
var n = 2; var a = 5.4; var result = (a << n) === Math.floor(a) * Math.pow(2,n); // 结果是真的 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
负32bit值始终在最左位:
a = 0b11111111111111111111111111110111 | 0; console.log(a); // -9 b = a >> 2; // 最左边的位向右移动1,然后新的最左边的位设置为on(1) console.log(b); // -3 b = a >>> 2; //最左边的位右移1。新的最左边的位设置为关闭 console.log(b); // 2147483643
>>>运算的结果始终为正。
a的结果>>始终与移位后的值相同。
正数的右移等于将Math.pow(2,n)结果除以和取底:
a = 256.67; n = 4; result = (a >> n) === Math.floor( Math.floor(a) / Math.pow(2,n) ); // 结果是真的 a = a >> n; // 16 result = (a >>> n) === Math.floor( Math.floor(a) / Math.pow(2,n) ); // 结果是真的 a = a >>> n; // 16
>>>负数右移零填充()是不同的。由于执行位操作时JavaScript不会转换为无符号整数,因此没有等效的操作:
a = -256.67; result = (a >>> n) === Math.floor( Math.floor(a) / Math.pow(2,n) ); // 结果是假的
除了not(~)以外,以上所有按位运算符都可以用作赋值运算符:
a |= b; //与:a = a | b; a ^= b; // 等同于: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的字节序匹配。当使用位长大于8位的类型化数组时,应在应用按位运算之前检查环境是Little Endian还是Big Endian。
警告:位运算符,例如&与|是不一样的逻辑运算符&&(和)和||(或)。如果用作逻辑运算符,它们将提供错误的结果。该^运算符不是动力运算符(a b)。