计算机组成原理——第二章(11)
这个小节我们讲一下定点数的移位运算,包括原码、反码、补码的移位运算,还有逻辑移位和循环移位是如何运算的
定点数的移位运算
1.算数移位
1.1原码
原码的算数移位——符号位保持不变,仅对数值位进行移位。记住是数值位,假设是对12.3的右移,那么就是把数值位右移,相对来说就是小数点左移,变成1.23。
需要注意的是,有人会把右移或者左移看成是乘法或除法,其实这是不对的,我们举个例子,二进制1,0000101 为-5D,右移之后为1,0000010 为-2D,按理来说应该是-2.5D,但是结果是-2D,丢失精度。
还有一个例子1,1010000 为-80D左移一位之后为1,0100000 为-32D,按理来说左移是*2但是出现了严重误差
所以做题的时候还是按照数值位移,再转进制,安全保险一点
1.2反码
因为正数的反码和原码相同,因此正数反码的移位运算也和原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
负数的反码数值位于原码相反
右移:高位补1,低位舍弃
左移:低位补1,高位舍弃
1.3补码
正数的补码与原码相同,因此正数补码的移位运算也和原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
负数的补码运算,以最右边的1为分界线,左移之后右边都补0,右移之后左边都补1
右移(同反码):高位补1,低位舍弃
左移(同原码):低位补0,高位舍弃
总结如下:
2.逻辑移位
逻辑移位比较简单,我们可以把逻辑移位看出“无符号数”的算数移位
逻辑右移:高位补0,低位舍弃
逻辑左移:低位补0,高位舍弃
逻辑移位应用举例
比如我们要存储一种颜色,大家都知道颜色是由RGB调整来的,我们要存这样的一种颜色
用3B存储无符号数102,并且逻辑左移16位
然后用3B存储无符号数139,并逻辑左移8位
然后用3B存储无符号数139
把三个得到的结果相加得3B的RGB值
3.循环移位
循环移位就是把挤出来的数字放到空出来的位置
这里要分成两类:带进位位的循环移位和不带进位位的循环移位
不带进位位:用移出的位补上空缺
带进位位:移出的位放到进位位,原进位位补上空缺
其实这两种处理方式是一样的,都是移了之后移出的位补上空缺
例如不带进位位的循环左移:10110101,左移之后出来的1补到最低位
带进位位的循环左移:1,10110101,左移之后出来的1补到最低位
思维导图