算术移位(指数码位的移动)通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。
算术移位针对有符号数,在移位过程中,符号位保持不变。
对于十进制来说,小数点左移1位,即数字右移相当于除以10,右移1位即数字左移相当于乘以10
那么对于二进制来说,算术右移 1位,相当于除以2;算术左移相当于乘以2
在计算机硬件实现时,移位之后需要对空位进行添补,区分正负数来讨论:
由于正数的原码、补码、反码相同,所以算术右移的时候高位补0,低位舍弃,若舍弃位是0,则相当于除以2,若舍弃位不是0,则会丢失精度;算术左移时,高位舍弃,若舍弃位是0,则相当于乘以2,若舍弃位不是0,则会出现严重误差。
而负数的原码算术移位时添补0
反码算术移位时添补1
补码左移添0,右移添1(最右边的1在变成原码时,会产生进位,所以从右往左第一个不是1的数字左边同反码,剩余同原码。所以添补规则左移时空出来右边,添补规则同原码;右移时空出来左边,添补规则同反码)
【例】计算机硬件实现-20*7
【分析】7D=111B= 2 0 + 2 1 + 2 2 2^{0}+2^{1}+2^{2} 20+21+22
即就是对-20执行(不左移、左移1位、左移2位、加法)这些操作
逻辑右移:高位补0,低位舍弃;
逻辑左移:低位补0,高位舍弃;
左移时最低位补0,右移时最高位补0的移位操作;可以把逻辑移位看做是对“无符号数”的算术移位(不考虑符号位)
应用场景举例1:原码一位乘法运算
在进行乘法运算过程中,乘数(保存在MQ中)的最低位与被乘数(保存在X中)运算后的结果会更新到ACC当中,之后(ACC和MQ)会执行逻辑右移,MQ低位丢弃,ACC逻辑右移后高位补0,MQ中新的低位继续与被乘数运算,得到的结果累加到ACC中,重复以上步骤,得到最终的结果(ACC和MQ拼接起来)
应用场景举例2:逻辑移位生成RGB色
戳这里:逻辑移位RGB
原码一位乘法:(机器字长n+1,数值部分占n位)
符号位通过异或确定;
数值部分通过被乘数和乘数绝对值的n轮加法、移位完成
根据当前乘数汇总参与运算的位确定(ACC)加什么,若当前运算位=1,则(ACC)+[|x|]原;若=0,则(ACC)+0
每轮加法后ACC、MQ的内容统一逻辑右移
移出的那一位数值添补到空出的那一位
带进位位的循环移位:
移出的那一位移动到进位位,空出的那一位用进位位的数值添补
应用场景举例:大端存储和小端存储的互相转换