• 随手笔记-二进制的正负计算


    以下计算基于字节单位,由于负数是以补码存储,所以一下负数表示形式皆为补码

    1.负数的二进制求法

      负数的二进制一般通过正数反推导出,即(正数二进制 -> 取反 -> 补码(加1)),举个例子:

      99的二进制为:‭0110 0011‬

      那么-99的二进制计算方法为

            0110 0011
    
       1.取反: 1001 1100  即0转为1,1转为0
    
       2.补码: 1001 1101  即低位加1
    
       那么,1001 1101即为十进制的 -99

      有同学要问了,如果低位为1该如何加1?这就是二进制的基础算法了,即逢二进一,举个例子:

      98的二进制为:0110 0010
    
          取反:1001 1101
    
          补码:1001 1110  这里1+1等于2了,所以不是相加,而是进一位

      那如果是1001 1111,结果就是1010 0000,这里有个规律,即从右向左找到第一个0,然后这个0后的数字全部变为0,而此0加1变为1

    2.由负数二进制推正数

      其实与正数退负一样,主要就是取反和补码,不过这里有一点概念上的点需要注意,即很多人通过负数进制反推正数时,习惯的按正数推负数的步骤反着来,

      即:

      -99:      1001 1101
    
      1.低位-1:   1001 1100
    
      2.取反:    0110 0011

      这么做的结果固然是正确的,但计算机是不做减法的,计算机的减法其实是加法,即1+(-1),所以我们理解起来正常的逻辑在计算机计算中并不适用

      那么按正常的算法,步骤应该为:

      -99:      1001 1101
    
      1.取反:    0110 0010
    
      2.补码:    0110 0011

      同样的先取反后补码。

      这么说可能不太好理解,有网友举出这样一个公式,这样就容易理解了:

      正数 + 负数 = 0

      正码 + 反码 + 1 = 0

      所以,正码取反+1即为反码,反码取反+1即为正码

    3.那么,如果正数与负数相加,该如何计算呢

      上面我们可以看到,正数99的二进制为0110 0011‬,正数的原码、反码、补码都是一样的,所以99的补码也是0110 0011‬,

      然后-98的补码为1001 1110,那么,两个进制相加结果:

          0110 0011
    
      +    1001 1110
    
      =   1 0000 0001

      高位溢出,则舍弃高位,所以结果为:0000 0001,即为10进制的1

      至于二进制的加法运算方法,如下:

      1.将数字对齐

      2.从右向左,上下上下两个数字相加

      3.如果不是1+1,即1+0、0+1、0+0,那就直接相加,如果两个数都是1,则1+1=10,结果列写上0,1向上进,这里规则跟普通十进制计算一样,比如13+8,3+8=11,结果列写上1,然后十位数的1向上进,然后1+1 = 2,结果即为21。

      4.如果超出位数,则从坐向右舍弃溢出的数字

      如果觉得文字表述不清楚,百度经验上有直观的的图片解释:https://jingyan.baidu.com/article/86112f135745432736978776.html

  • 相关阅读:
    成佛、远不止渡沧海
    导航栏中各按钮在点击当前按钮变色其他按钮恢复为原有色的实现方法(vue、jq、原生js)
    vue动态绑定src加字符串拼接
    对象中那些不注意的用法
    vue实现实时监听文本框内容的变化(最后一种为原生js)
    table
    toFixed()精度丢失;复选框全选、取消
    vue.js
    vue项目知识点总结
    JVM基础知识总结
  • 原文地址:https://www.cnblogs.com/nvsky/p/11465795.html
Copyright © 2020-2023  润新知