2.2_5 定点数的移位运算
算术移位
小数点向后移动1位相当于*10
小数点向前移动1位相当于/10
移位:通过改变各个数位码和小数点的相对位置,从而改变位权,实现乘法和除法
原码的算术移位
符号位不变,仅对数值位进行移位
右移:高位补0,低位舍弃,如果舍弃的位=0,就相当于➗2;如果舍弃的位=1,就会丢失精度。
左移:低位补0,高位舍弃,如果舍弃的位=0,就相当于×2;如果舍弃的位=1,就会出现严重误差。(权值最高的1无了)
反码的算术移位
-
正数:正数的反码于原码相同,所以与原码的算术移位相同。
- 右移:高位补0,低位舍弃
- 左移:低位补0,高位舍弃
-
负数:负数的反码数值位与原码相反(符号位不变)
- 右移:高位补1,低位舍弃
- 左移:低位补1,高位舍弃
补码的算术移位
-
正数:正数的补码于原码相同,所以与原码的算术移位相同。
- 右移:高位补0,低位舍弃
- 左移:低位补0,高位舍弃
-
负数:负数的补码等于反码+1,所以反码后面的1因为进位变成了0。
- 所以:负数的补码的前半段和负数的反码相同,后半段和原码相同,分界点为后往前数第一个1。
- 右移(同反码):高位补1,低位舍弃
- 左移(同原码):低位补0,高位舍弃
例子:
符 64 32 16 8 4 2 1 1 0 0 1 0 1 0 0 -20 1 0 1 0 1 0 0 0 -40 1 0 1 0 0 0 0 -80
-140=-20+-40+-80
逻辑移位
- 逻辑右移:高位补0,低位舍弃
- 逻辑左移:低位补0,高位舍弃
- 可以看作是对无符号数的算术移位
例子:
循环移位
移出来的补给空缺的部位
进位位:CF=1 左移让进位位传给最低位进行补充 右移同理