各种码的作用:
模运算的性质:
-3=(-1)*12+9
9=0*12+9
21=1*12+9
33=2*12+9
-15=(-2)*12+9
我们发现等号右边都是+9,相当于等号的左边的数除去12的余数都是9
那我们就说这几个等好左边的数,在mod12的情况下,是等价的
我们发现-3和9互为补数,两者绝对值之和=模
加减运算:
有符号数相加,当+14与-14相加,计算机怎么算呢?
+14+(-14)=0
任何运算结果在mod2的8次方后,都只会保留最低的八位
00001110(+14)
10001110(-14)
将-14取补码然后与+14相加再mod2的8次方,这样就说将减法变为加法来运算
移位运算:
算数移位
原码的算数移位——符号位不变,仅对数值进行移位
右移:高位补0,低位舍弃,舍弃的位数=0,相当于/2,如果舍弃的位不等于0,则会丢失精度
左移:低位补0,高位舍弃。舍弃的位数=0,相当于*2,如果不是0,则会出现有严重误差
补码的算数移位:
逻辑移位:
逻辑右移:高位补0,低位舍弃,
逻辑左移:低位补0,高位舍弃
循环移位:
定点数的乘法运算:
原码一位乘法:
原码的一位乘法:符号位和数值位是分开算的
假设数值位为n位,符号位为1位,所以一共为n+1位的数值
原码的一位乘法是通过运算器来完成的
一位乘法的运算规则:
- 将被乘数和乘数取绝对值参加运算,看作无符号数,符号位通过两个数的符号位异或得到(x^y)
- 乘数(ACC)的每一位y[i]乘于被乘数(X)得到x[i]*y[i],将该结果与前面所得的结果想加后的值就是部分积(部分积是乘法过程的中间结果,初始化为0)
- 从参数的最低位y[n]开始判断:
当y[n]=1,则部分积加上被乘数|x|,然后右移一位(这指的右移是ACC和MQ一起右移,此时ACC的最低位会变成MQ的最高位)
当y[n]=0,则部分积+0,然后右移一位。
示例讲解:
例:设x=-0.1101,y=0.1011.采用一位乘法求x*y
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r7MeMm2n-1684543579506)(https://typoraph.oss-cn-shenzhen.aliyuncs.com/%E5%8A%A8%E7%94%BB.gif)]
补充知识点:
异或:相同为0,相异为1
补码的一位乘法:
注意
- 补码的一位乘法需要在MQ上加一个位置(辅助位)
- ACC和X也因此多加了一位在前面(多加的位为符号位,即:双符号位,而MQ为单符号位)
因此每个都有n+2位
- 下面说的MQ中的最低位其实是MQ的倒数第二位,因为最后一位是辅助位
一位乘法的运算规则:
补码一位乘法:进行 n轮加法、移位,最后再多来一次加法
每次加法可能+0、+[x]补、[-x]补
每次移位是“补码的算数右移,符号位参与运算
根据当前MQ中的最低位辅助位 来确定加什么
辅助位- MQ中最低位=1时,ACC+[X]补
辅助位-MQ中最低位 =0时,ACC+0
辅助位-MQ中最低位 =-1时,ACC+[-X]补
问题
设x=-0.1101,y=0.1011,设用Booth算法求x*y?
这是进行了n次,还要再进行一次,ACC等于11.0111
【xy】补=1.01110001 所以【x *y】等于-0.10001111
定点数的除法运算:
我们这里主要介绍的是补码的除法运算
这里需要符号位和数值位一起参加运算
规则如下:
- 除数和被除数、商、余数都用补码表示
- 当除数和被除数同号时,则减去除数,如果异号,则加上除数
- 当余数与除数同号,则商上1,余数左移一位减去除数,如果异号,则商0,余数左移一位加上除数
- 最后的时候需要商的末位恒置为1