Skip to content

位运算

将一个整数的二进制格式进行运算。

在 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。

提示

  1. 按位非运算符对 n 运算得到的是 - n - 1
  2. JS 中最快速的取整方式是 ~~n

位移运算

左移

JavaScript
console.log(1 << 1); // 2
console.log(1 << 2); // 4

右移

JavaScript
console.log(1 >> 1); // 0
console.log(1 >> 2); // 0

警告

  1. 位移运算符会将负数当成无符号数来处理,即符号位不变。
  2. 由于右移会丢失数据,可以将右移操作符等价于 Math.floor(n / 2)

全右位移

JavaScript
console.log(1 >>> 1); // 0
console.log(1 >>> 2); // 0
console.log(-1 >>> 1); // 2147483647