定点数的移位运算

507 阅读2分钟

2.2_5 定点数的移位运算

算术移位

小数点向后移动1位相当于*10

小数点向前移动1位相当于/10

移位:通过改变各个数位码和小数点的相对位置,从而改变位权,实现乘法和除法

原码的算术移位

符号位不变,仅对数值位进行移位

右移:高位补0,低位舍弃,如果舍弃的位=0,就相当于➗2;如果舍弃的位=1,就会丢失精度。

左移:低位补0,高位舍弃,如果舍弃的位=0,就相当于×2;如果舍弃的位=1,就会出现严重误差。(权值最高的1无了)

反码的算术移位

  1. 正数:正数的反码于原码相同,所以与原码的算术移位相同。

    1. 右移:高位补0,低位舍弃
    2. 左移:低位补0,高位舍弃
  2. 负数:负数的反码数值位与原码相反(符号位不变)

    1. 右移:高位补1,低位舍弃
    2. 左移:低位补1,高位舍弃

补码的算术移位

  1. 正数:正数的补码于原码相同,所以与原码的算术移位相同。

    1. 右移:高位补0,低位舍弃
    2. 左移:低位补0,高位舍弃
  2. 负数:负数的补码等于反码+1,所以反码后面的1因为进位变成了0。

    1. 所以:负数的补码的前半段和负数的反码相同,后半段和原码相同,分界点为后往前数第一个1。
    2. 右移(同反码):高位补1,低位舍弃
    3. 左移(同原码):低位补0,高位舍弃

    例子:

    6432168421
    10010100-20
    10101000-40
    1010000-80

Untitled 1.png

-140=-20+-40+-80

逻辑移位

  1. 逻辑右移:高位补0,低位舍弃
  2. 逻辑左移:低位补0,高位舍弃
  3. 可以看作是对无符号数的算术移位

例子:

Untitled 2.png

Untitled.png

循环移位

移出来的补给空缺的部位

进位位:CF=1 左移让进位位传给最低位进行补充 右移同理

Untitled 3.png