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使用BigEndian存储整数。这并不总是与设备/OS的字节序匹配。当使用位长大于8位的类型化数组时,应在应用按位运算之前检查环境是LittleEndian还是BigEndian。
警告:位运算符,例如&与|是不一样的逻辑运算符&&(和)和||(或)。如果用作逻辑运算符,它们将提供错误的结果。该^运算符不是动力运算符(ab)。