二进制操作符

  • &
    • 按位与 and
  • |
    • 按位或 or
  • ^
    • 按位异或 xor
  • ~
    • 按位非 not
  • <<
    • 左移
  • >>
    • 右移
  • >>>
    • 无符号右移
AND
1 & 1 1
1 & 0 0
0 & 0 0
OR
1 | 1 1
1 | 0 1
0 | 0 0
XOR
1 ^ 1 0
1 ^ 0 1
0 ^ 0 0
NOT
~ 1 0
~ 0 1
left shift 全部补 0
0000 1001 << 2 0010 0100
right shift 正数补 0 ,负数补 1
0000 1001 >> 2 0000 1001
1111 0111 >> 2 111111 01
unsigned right shift 全部补 0
0000 1001 >>> 2 0000 1001
1111 0111 >>> 2 001111 01

机器数

机器表示数的方式就是二进制方式
JavaScript 是使用 64位 有符号。

  1. // 8 位二进制数
  2. console.log((10).toString(2).padStart(8, '0')); // => 00001010
  3. // 二进制转十进制
  4. console.log(0b00001010); // => 10
  5. console.log(parseInt('00001010', 2)); // => 10

真值

真实的值,即正常一般的值
代表与 十进制相等的 二进制 的值

原码

一般的表示方法,以最高位来表示符号

  • 最高位为 0 表示正数
  • 最低位为 1 表示负数 | 真值 | 原码 | | —- | —- | | +1 | 0000 0001 | | -1 | 1000 0001 | | 8位有符号的最大值与最小值 | | | 127 | 0111 1111 | | -127 | 1111 1111 |

反码

正数:本身
负数:符号位不变,其它位取反

真值 原码 反码
+1 0000 0001 0000 0001
-1 1000 0001 1111 1110

补码

正数:本身
负数: 符号位不变,其它位取反,最后再 +1
即反码的基础上 +1

真值 原码 反码 补码
+1 0000 0001 0000 0001 0000 0001
-1 1000 0001 1111 1110 1111 1111

二进制减法问题

反码与补码是解决二进制减法的问题

真值 1 + -1 0
原码 0000 0001 + 1000 0001 1000 0010 = -2 用原码的表示方式是做不到
反码 0000 0001 + 1111 1110 1111 1111 = -127 再由反码转为原码 1000 0000 = -0 真值的符号位不正确
补码 0000 0001 + 1111 1111 10000 0000 = 0 超出的位数舍弃 0000 0000 = 0

二进制的加减法是使用 补码 来运算