JS按位操作符

按位操作符(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

~ 按位非

因为不太理解 按位非的计算结果,所以查了下资料,总结了计算步骤如下。

计算步骤:
  1. 输入 ~7
  2. 转换成二进制,就是 0b00000111(首位是符号位,下同)
  3. 取补码,就是0b00000111(正数的补码就是其本身)
  4. 再按位取反,就是 0b11111000.
  5. 将补码转为原码,因为0b11111000是负数,所以转为原码的过程就是再求一次补码, 0b11111000(原)= 0b10000111(反) = 0b10001000(补)
  6. 返回结果 -8
再补充下原码反码补码的知识点,如下
  • 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制(第一位是符号位):
    +1 = 0b0000 0001(原)
    -1 = 0b1000 0001(原)

  • 反码的表示方法是:
    正数的反码是其本身,
    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
    +1 = 00000001(原) = 00000001(反)
    -1 = 10000001(原) = 11111110(反)

  • 补码的表示方法是:
    正数的补码就是其本身,
    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
    +1 = 00000001(原) = 00000001(反) = 00000001(补)
    -1 = 10000001(原) = 11111110(反) = 11111111(补)

如果对你有帮助的话,记得点赞哦-

你可能感兴趣的:(JS按位操作符)