JavaScript 按位运算符

示例

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