按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
下面的表格总结了JavaScript中的按位操作符:
运算符 | 用法 | 描述 | 例子 |
---|---|---|---|
按位与( AND) | a & b |
对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。 | 0b1110 & 0b1101 === 0b1100 |
按位或(OR) | a | b |
对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。 | 0b1110 | 0b1101 === 0b1111 |
按位异或(XOR) | a ^ b |
对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。 | 0b1110 ^ 0b1101 === 0b0011 |
按位非(NOT) | ~ a |
反转操作数的比特位,即0变成1,1变成0。 | ~0b1110 === -0b1111 |
左移(Left shift) | a << b |
将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。 |
0b00001110 << 2 === 0b00111000 |
有符号右移 | a >> b |
将 a 的二进制表示向右移b (< 32) 位,丢弃被移出的位。 |
0b00001110 >>2 === 0b00000011 |
无符号右移 | a >>> b |
将 a 的二进制表示向右移b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。 |
-1 >>> 1 === 2147483647, -1 >>>31 ===1 |
~ 按位非
因为不太理解 按位非的计算结果,所以查了下资料,总结了计算步骤如下。
计算步骤:
- 输入 ~7
- 转换成二进制,就是 0b00000111(首位是符号位,下同)。
- 取补码,就是0b00000111(正数的补码就是其本身)。
- 再按位取反,就是 0b11111000.
- 将补码转为原码,因为0b11111000是负数,所以转为原码的过程就是再求一次补码, 0b11111000(原)= 0b10000111(反) = 0b10001000(补)
- 返回结果 -8
再补充下原码,反码和补码的知识点,如下
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制(第一位是符号位):
+1 = 0b0000 0001(原)
-1 = 0b1000 0001(原)反码的表示方法是:
正数的反码是其本身,
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
+1 = 00000001(原) = 00000001(反)
-1 = 10000001(原) = 11111110(反)补码的表示方法是:
正数的补码就是其本身,
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
+1 = 00000001(原) = 00000001(反) = 00000001(补)
-1 = 10000001(原) = 11111110(反) = 11111111(补)
如果对你有帮助的话,记得点赞哦-