大家好,欢迎来到程序视点
!我是小二哥。
在之前的文章中,我们了解到计算机的底层只能处理二进制格式的数据,也就是0和1。因此,二进制位运算是最贴近计算机真实运算操作。
其他任何文字、数字、字符等信息都要转换成二进制的格式,计算机的底层才能识别处理。
那计算究竟是怎么处理操作的呢?
答案就是:位运算
。
通过位运算,计算机可以高效的完成各种基础运算,也可以巧妙的完成原本很复杂的工作。了解位运算,能让我们真正理解计算机,也能更好的使用计算机。本文先来分享基础运算中的加法,看看真实的运算逻辑是怎样实际应用的。
计算机对于“+”(加号)的理解,只是一个符号而已。如果我们想让计算机明白“+”的职能的,那我们就需要赋予计算机这个职能。再通俗点讲,就是:当计算机看到我们输入“+”时,就要去调用一定的运算步骤来完成这个功能。
以13+9为例,我们来看看计算的步骤:
先前进1
;进了一个1上来
,因此十位上的结果应该是2;个位上是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。
sum' = 22
来表示结果。carry'=0
来表示结果。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;那我们继续吧!
结果sum' = 0001 0110
。(我用不同颜色标识了存在加的情况。可以看到每一位相加后都没有进位的情况)
carry' = 0000 0000
,也就是0。carry'=0
,不再重复步骤1、2、3了,sum'就是最终结果,即0001 0110
,转为十进制刚好是22。最终,通过对数据的二进制进行运算,我们也得到了正确的结果。那计算机怎么实现位上的相加和进位呢?这篇文章已经有点长了。我们下一篇文章通过代码的方式来模拟实现这个过程。有知道怎么代码模拟实现的小伙伴,也可以留言哦~
ps:给大家提示下。什么位运算让0和1结果为1,1和1结果为0呢?