原码·反码·补码及JS中二进制转换

原码·反码·补码都是为了解决一个问题而诞生的: 如何用二进制表示复数。 并且他们间有着某种进化的关系。

  • 原码: 最高位表示符号位,正数为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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容