原码·反码·补码都是为了解决一个问题而诞生的: 如何用二进制表示复数。 并且他们间有着某种进化的关系。
- 原码: 最高位表示符号位,正数为0,复数为1(以基于四个bits操作为例)
10 = (01010)原码 -10 = (11010)原码 - 反码(one's complement): 在原码的基础上正数不变,负数取反,为了解决+1 和 -1相加不等于0的问题。-10 = (10101)反码,并且 10 + (-10)= 01010 + 10101 = 11111 = -0
- 补码 (two's complement): 在反码的基础上,正数不变,负数取反后再加一。-10 = (10110),解决了+0 和 -0,有两个零的问题。
JS中如何转换为其他进制
const number = -10;
const binary = number.toString(2); //类型为String
const oct = number.toString(8);
const hex = number.toString(16);
这里的输出是"-1010" 而不是补码
知道原理后我们可以自己写函数将其转为补码
func twoComple(num){
const reg = /1|0/g;
var binary = num.toString(2);
var twoC = binary.replace(reg,(x) => {return x === "0" ? "1" : "0"}); //取反
twoC = twoC.substr(1); //除去符号位
num = Number(twoC) + 1; //加一
twoC = '1' + num.toString(2); //添加符号位
return twoC