摘要:
CS中不可能少的了二进制数的加减乘除,之前学习数电时进行总结过,但是又忘了,在学习《计算机组成原理》的定点和浮点运算中,又一次出现除法,特此在此记录,以便下次使用: 2021年12月7号18点19分
二进制数的加法
加法很简单,原则就是逢二进一 比如下例:
1 0 0 1
+
0 1 0 1
___________________
1 1 1 0
二进制数的减法
- 如果采用与十进制减法相同的方法,那么从一个较大的二进制数中减去一个较小的无符号二进制数是一个道理
- 如果较小的减去较大的就要向前借位
1 0 0 1(减数) + 0 1 0 1(被减数) ___________________ 0 1 0 0
分析:(从后先前)
- 1-1 = 0
- 0-0 = 0
- 0-1 产生借位,向前一位借1 变为 10(2^1 = 2) -1 = 1
- 0-0 =0
除了以上的方法,我们知道总是可以将二进制的减法转化为加法操作。 这里必须引入原码、补码、反码的概念 公式为: 补码 = 反码 + 1
具体来讲:即将被减数的符号位取反+1,然后将两数相加。这个方法要求用一个额外的位来保存数的符号。
1 0 0 1(减数)
+
1 0 1 0(被减数)
+ 1
___________________
1 0 1 0 0
因为该数只有四位,所以舍去最高位1 ,结果为0 1 0 0
二进制数的乘法
按照被乘数的低位到高位依次计算,如果第n位不为0,那么乘数就左移n位,如果第n为为0,那么这步运算结果记为0,最后将每一步的结果相加就是最终的计算结果。
- step1:检测被乘数0101 的第1位为1,即1*2^0,该位不为0,则乘数1001左移0位后为1001
- step2:检测被乘数0101 的第2位为0,即0*2^1,该位为0,本次不做运算,结果记为0
- step3:检测被乘数0101 的第3位为1,即1*2^2,该位不为0,则乘数1001左移2位后为100100
- step4:检测被乘数0101 的第4位为0,即0*2^3,该位为0,本次不做运算,结果记为0
- step5:将结果相加即可
1 0 0 1(乘数) * 0 1 0 1(被乘数) ___________________ 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 ———————————————————— 0 1 0 1 1 0 1
二进制数的除法(一)
除法的规则是:按照除数的高位到低位的数字依次和被除数进行比对,
- 如果大于等于被除数,则此步结果记为1,并求得余数,
- 如果小于被除数则将上一步的余数左移一步加上一位的数字再次比较,
- 以此类推,最终将依次计算的结果相连组成二进制就是商,最后一次的余数就是求余的结果。
如图1所示
- step1:检测被除数1001的第一位为1,1 < 0 1 0 1(除数),则结果记0 余1
- step2:检测除数1001的第2位为0,上一步的余数为1,左移一位10 + 0 =10 < 0 1 0 1,则结果记0 余10
- step3:检测除数1001的第3位为0,上一步的余数为11,左移一位100 +0=100 < 0 1 0 1,则结果记0 余100
- step4:检测除数1001的第4位为1,上一步的余数为100,左移一位1000 + 1 =1001 > 0 1 0 1,则结果记1 余 100
二进制数的除法(二)
图4为《计算机组成原理》唐朔飞书中介绍的方法:(哈工大P87 6.3定点运算(下)6.3-d1)
规则:
- 商是由比较余数(被除数)和除数的大小,确定商为1还是0,(若余数(被除数)<除数,则商为0,否则为1,换句话说除数小,商1,除数大,商0)
- 得到余数后,进行减法操作,此时余数不动,低位补0,然后再减去右移后的除数
- 商的位置不固定
- 商符单独处理(负正得负)
根据图4和规则分析过程如下:
- 除数为y(0.1101),被除数为x(-0.1011)
- step1:比较被除数和除数得大小(绝对值),显然被除数x小于除数y。即除数大,根据规则1,则商为0
- step2:此时给被除数最低为补0,再和右移1位的除数(0.01101)做比较,此时,显然除数小,故商为1;
- step3:此时将补0后的余数(0.10110),减去右移一位得的数。除数右移一位(0.01101)
- step4:减法得结果为:0.10110 - 0.01101 = 0.01001(余数(新)),
- step5:给新余数后补0(0.010010),再和右移2位的除数为(0.001101),显然右移2位的除数小,则商1
- step5:做减法:将0.010010 - 0.001101 = 0.0001 01(新余数)
- step6:将新余数后补0 (0.0001 010),此时将新余数和右移三位的除数(0.0001 101)做比较,显然除数大,商为0
- step7:给新余数添0,与右移4位的除数比较,显然除数小,则商为1
- step8.再做减法,便得到余数
- step9:总结: 商符为:负,商为:-0.1101,余数为0.00000111