计算机底层怎么实现加法的?

2023-10-25 17:11:05 浏览数 (1)

将程序视点设为星标精品文章第一时间阅读

大家好,欢迎来到程序视点!我是小二哥。

前言

在之前的文章中,我们了解到计算机的底层只能处理二进制格式的数据,也就是0和1。因此,二进制位运算是最贴近计算机真实运算操作。

其他任何文字、数字、字符等信息都要转换成二进制的格式,计算机的底层才能识别处理。

那计算究竟是怎么处理操作的呢?

答案就是:位运算

通过位运算,计算机可以高效的完成各种基础运算,也可以巧妙的完成原本很复杂的工作。了解位运算,能让我们真正理解计算机,也能更好的使用计算机。本文先来分享基础运算中的加法,看看真实的运算逻辑是怎样实际应用的。

13 9

计算机对于“ ”(加号)的理解,只是一个符号而已。如果我们想让计算机明白“ ”的职能的,那我们就需要赋予计算机这个职能。再通俗点讲,就是:当计算机看到我们输入“ ”时,就要去调用一定的运算步骤来完成这个功能。

十进制下的运算步骤

以13 9为例,我们来看看计算的步骤:

  1. 个位上的数相加:3 9 = 12,个位上的结果为2,同时需要先前进1;
  2. 十位上的数相加:1 0 = 1,十位上的结果为1;但在1的步骤中进了一个1上来,因此十位上的结果应该是2;
  3. 个位和十位上的数都计算出来了:个位上是2,十位上是2,结果为22

上面是小学的内容,对大家来说闭着眼睛都能算!

好啦!现在我们来把这个运算过程拆分分组下。既然个位和十位上的数都有加的操作,那就可以先同时计算;个位上有进位的操作,那就把进位操作和加操作拆开来计算。就得到下面这个运算过程:

1:不考虑进位,只考虑加。 分别对各位上的数进行相加,结果存为sum。个位数3加上9为2;十位数1加上0为1;最终结果 sum = 12(每考虑个位往十位上进的数)。 2:只考虑进位 只计算各位上进位的值,结果存为carry。个位数上3加上9 有进位,进位的值为10;十位数上1 加上0没有进位;最终进位的结果 carry = 10。 3:判断步骤2中的进位结果 如果步骤二所得进位结果carry不为0,对步骤一所得sum以及步骤二所得carry,重复步骤1、2、3。如果carry为0则结束,最终结果为步骤一所得sum。 这题中步骤2中的结果是carry = 10,不为0,因此对sum和carry重复步骤1、2、3

  • 3.1:不考虑进位,只考虑加。sum个位上是2,carry个位上是0,相加得到个位上的数为2;sum十位上是1,carry十位上也是1,相加得到十位上的数为2;最终得到结果22。我这里为了区分,用 sum' = 22 来表示结果。
  • 3.2:只考虑进位。sum个位上是2,carry个位上是0,相加没有进位;sum十位上是1,carry十位上也是1,相加也没有进位;这次最终进位的结果是都没进位,结果为0,用carry'=0来表示结果。
  • 3.3:判断上一步中的进位结果。进位结果carry'=0,不再重复步骤1、2、3了,sum'就是最终结果。

我们看到使用把运算拆分分组的方式,我们最终也得到了正确答案22。

好啦!我们从前几期的文章中可以,二进制和十进制的区别是满多少向前进位而已。因此,十进制可以使用的运算拆分分组的方式,是不是也能解决二进制的问题呢?我们拭目以待!

二进制下的运算步骤

13的二进制为0000 1101,9的二进制为0000 1001

1:不考虑进位,只考虑加 分别对各位数进行相加。

结果sum = 0000 0100。(注意,图中红底所在的位相加存在进位的情况,但这一步不考虑进位) 2:只考虑进位 有两处进位,第0位和第3位。

绿底是进位的结果位。因此,只考虑进位的结果为 carry = 0001 0010。3:判断步骤2中的进位结果 步骤2中的结果carry不为0,重复步骤1 、2 、3;那我们继续吧!

  • 3.1:不考虑进位,只考虑加。sum = 0000 0100, carry = 0001 0010。

结果sum' = 0001 0110。(我用不同颜色标识了存在加的情况。可以看到每一位相加后都没有进位的情况)

  • 3.2:只考虑进位。由上面3.1步骤中可知,这次每位上都没发生进位。因此,结果carry' = 0000 0000,也就是0。
  • 3.3:判断上一步中的进位结果。进位结果carry'=0,不再重复步骤1、2、3了,sum'就是最终结果,即0001 0110,转为十进制刚好是22。

最终,通过对数据的二进制进行运算,我们也得到了正确的结果。那计算机怎么实现位上的相加和进位呢?这篇文章已经有点长了。我们下一篇文章通过代码的方式来模拟实现这个过程。有知道怎么代码模拟实现的小伙伴,也可以留言哦~

ps:给大家提示下。什么位运算让0和1结果为1,1和1结果为0呢?

0 人点赞