二进制操作符
&
- 按位与 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); // => 10
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 |
二进制的加减法是使用 补码 来运算