您现在的位置是:首页 > 创新技术
计算机是怎么懂加减乘除的
智慧创新站
2024-12-17【创新技术】121人已围观
简介加法说到加法,首先提到的一个概念就是全加器,下图是一个全加器的数字逻辑电路。其中,异或门的输出Y=A^B,与非门的输出就是先与再非,即Y=!(AB)。这里我就不再列真值表了,我们再来看一下上面全加器的逻辑,通过推导可以得到下面公式:这是一位(1bit)的加法运算,当我们把8个全加器级联起来的话(低位...
说到加法,首先提到的一个概念就是全加器,下图是一个全加器的数字逻辑电路。
其中,异或门的输出Y=A^B,与非门的输出就是先与再非,即Y=!(AB)。这里我就不再列真值表了,我们再来看一下上面全加器的逻辑,通过推导可以得到下面公式:
这是一位(1bit)的加法运算,当我们把8个全加器级联起来的话(低位的Cout是高位的Cin)就实现了一个8位的加法器。我们可以用代码模拟一下(LeetCode371.两整数之和):
说到这里,大家应该大体的了解计算机是怎么计算加法的了,那减法呢?
减法加法是进位,减法需要考虑的则是借位,是这样吗?按我们小时候对加减法学习的经验是这样的,但是计算机不是这么处理的。计算机“只有加法”,“没有减法”。肯定有同学说,不可能,那我们算inta=b-c是怎么得出来结果的呢?说到这个首先要了解另外一个概念——补码。
补码
我们知道,计算机中对于有符号数,用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余数位用作数值位,代表数值。比如Byte类型的取值范围为-128~127。其中,表示数值的只有7位,首位表示正负。
怎么推导一个数字的补码呢?补码规定,正数和0的补码就是其原码(原码、反码的定义这里就不多赘述),负数的补码是其正数的原码取反再加1。
听起来有点绕,举个例子,求-10的补码:
十进制10的原码(按8位举例)为00001010,其反码为11110101,取反后再加1即为其补码:11110110。因此,-10的补码为11110110。
不知道写到这里,大家有没有发现什么端倪?我们再回到减法计算来。
我们算一下下面的式子:
12-5
=00001100+11111011
=(1)00000111
=7括号里为进位,因为只有8位,所以高于8位的进位要去掉。
7-9
=00001111+11110111
=11111110
=-2
通过这两个例子是不是就清楚了计算机是如何计算减法的了?
乘法通过说减法,我们是不是对乘法也有一定的启发了呢?乘法其实就是循环的加法。比如5*3实际上就是5+5+5。貌似就说完了。实际上不仅仅如此的。现在有一个电子器件叫做乘法器,其可以实现二进制的乘法、除法等运算。我们同样以5*3做为例子,讲解一下乘法器计算乘法的流程。
5*3=00000101*00000011
虽然有乘法器,但是我们发现实际的最终操作流程还是加法和位移操作计算的乘法运算。我们写的代码中的乘法到底是用乘法器算的还是转化成加法运算,我们也并不太确定,有些编译器编译的时候会对代码进行优化,会选取最优的一种算法来计算结果。
除法除法可以通过减法来实现,比如10/3等价于10一直减3直到被减数小于3,减了3次,那么10/3的结果就为3了,余数为减完剩下的值1。
其实上面已经提到了乘法器,除法的原理同样也类似(这里不说浮点数的除法,只说整数的除法),但是稍微复杂一点。(LeetCode29.两数相除)
同样我们举个例子来说明一下。
209/5=11010001/00000101
于是结果为00101001(41),余数为100(4)。
通过上面我们发现,计算机计算加减乘除,都是转换为加法和位移运算完成的,而事实上也是如此。可能我们平时编程过程中可能用不到这些内容,直接写+-*/就可以了,但是作为一名程序员,还是有必要了解一下计算机基础的编码以及基础的运算的。祝大家学习愉快!
很赞哦!(35)