按位运算符将其操作数当做 32 位的比特序列(由 0 和 1 组成),而不是十进制、十六进制或八进制数值。
我们主要了解的有七种,分别是:&
、|
、^
、~
、<<
、>>
、>>>
。
按位与运算符
按位与 &
运算符,对两个 32 位表达式的每一位执行按位与运算。如果 a 和 b 都为 1 则结果为 1,否则结果为 0。
a | b | a & b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
示例:
下面演示如何使用 &
运算符:
console.log(1 & 3); // 1
1 & 3
的结果为 1,1 的二进制表示为 00000001,3 的二进制表示为 00000011,根据 &
的规则,相同得 1,不同得 0,可以得出结果为 00000001,即 1。
按位或运算符
按位或 |
运算符,只要 a 和 b 有一个为 1,则结果为 1,否则结果为 0。
a | b | a \ | b |
---|---|---|---|
0 | 0 | 0 | |
0 | 1 | 1 | |
1 | 0 | 1 | |
1 | 1 | 1 |
示例:
|
运算符和 &
运算符的区别在于,只要有一个操作数为 1,结果就为 1。同样是 1 | 3
,结果输出为 3。
console.log(1 | 3); // 3
1 的二进制表示为 00000001,3 的二进制表示为 00000011,根据 |
的规则,得到 00000011,转为十进制,结果为 3。
按位异或运算符
按位异或 ^
运算符,当 a 和 b 不相同时,结果为 1,否则结果为 0:
a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
示例:
^
运算符和 |
运算符有点类似,不同在于,如果操作位都为 1,则结果为 0。
console.log(1 ^ 3); // 2
1 的二进制表示为 00000001,3 的二进制表示为 00000011,根据 ^
的规则,得到 00000010,转为十进制,结果为 2。
按位非运算符
按位非 ~
运算符,对位求反,将 1 变 0,将 0 变 1,也就是求二进制的反码。
a | ~a |
---|---|
0 | 1 |
1 | 0 |
示例:
例如 1 的二进制表示为 00000001,取反得到 11111110,转为十进制,得到 -2:
console.log(~1); // -2
console.log(~0); // -1
console.log(~3); // -4
右移运算符
右移 >>
运算符,使指定值的二进制所有位都右移规定的次数,对于其移动规则只需记住符号位不变,左边补上符号位即按二进制形式把所有的数字向右移动对应的位数,低位移出 (舍弃),高位的空位补符号位,即正数补零,负数补 1。
示例:
例如 1 的二进制为 00000001,所以 1 >>1 的结果为 1:
console.log(1 >> 1); // 0
console.log(8 >> 2); // 2
console.log(64 >> 2); // 16
console.log(128 >> 1); // 64
左移运算符
左移 <<
运算符,使指定值的二进制所有位都左移规定的次数,对于其移动规则只需记住丢弃最高位,0 补最低位即按二进制形式把所有的数字向左移动对应的位数,高位移出 (舍弃),低位的空位补零。
示例:
console.log(1 << 1); // 2
console.log(8 << 2); // 32
console.log(64 << 2); // 256
无符号右移
无符号右移 >>>
,该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用 0 填充。因为符号位变成了 0,所以结果总是非负的。
示例:
console.log(-5 >>> 1); // 2147483645
console.log(-8 >>> -2); // 8
console.log(-24 >>> 2); // 1073741818
动手小练习
1. 分别用七种按位运算符输出一些自定义的内容,然后有一个更进一步的认识与了解。
2. 请说出下列代码的输出结果:
console.log(9 & 16);
console.log(5 & 1);
console.log(3 ^ 9);
console.log(~11);
console.log(36 >> 2);
console.log(6 << 6);
console.log(56 >>> 2);