位运算
将一个整数的二进制格式进行运算。
在 JS 中,如果对一个数据进行位运算,它首先会将其转换为一个证书,并且按照 32 位的正数二进制排列。比如,3.2 会被转化为 0000 0000 0000 0000 0000 0000 0000 0011
。
警告
NaN 和 Infinity 在位运算中都会被当作 0 来处理。
按位与
JavaScript
console.log(1 & 1); // 1
console.log(1 & 0); // 0
console.log(0 & 0); // 0
按位或
JavaScript
console.log(1 | 1); // 1
console.log(1 | 0); // 1
console.log(0 | 0); // 0
按位异或
JavaScript
console.log(1 ^ 1); // 0
console.log(1 ^ 0); // 1
console.log(1 ^ 2); // 3
应用场景:位元旗标。
按位非
JavaScript
console.log(~1); // -2
console.log(~0); // -1
console.log(~NaN); // -1
负数的存储方式
-1 的存储方式
真码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
因此,1 的按位非结果为 1111 1111 1111 1111 1111 1111 1111 1110
,减一取反得到 1000 0000 0000 0000 0000 0000 0000 0010
,即 -2。
提示
- 按位非运算符对 n 运算得到的是
- n - 1
。 - JS 中最快速的取整方式是
~~n
。
位移运算
左移
JavaScript
console.log(1 << 1); // 2
console.log(1 << 2); // 4
右移
JavaScript
console.log(1 >> 1); // 0
console.log(1 >> 2); // 0
警告
- 位移运算符会将负数当成无符号数来处理,即符号位不变。
- 由于右移会丢失数据,可以将右移操作符等价于
Math.floor(n / 2)
。
全右位移
JavaScript
console.log(1 >>> 1); // 0
console.log(1 >>> 2); // 0
console.log(-1 >>> 1); // 2147483647