二进制操作符
&- 按位与 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位 有符号。
// 8 位二进制数console.log((10).toString(2).padStart(8, '0')); // => 00001010// 二进制转十进制console.log(0b00001010); // => 10console.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 |
二进制的加减法是使用 补码 来运算
