一、前言
1. 移位运算的意义(非考点,仅为加强理解):
计算机中还没有乘除法运算电路时,可通过 加法 + 移位 来实现乘除法。
二进制下左移一位(不考虑溢出),相当于×2;右移一位(不考虑精度丢失),相当于÷2。
2. 分类
根据操作数类型的不同,移位运算可以分为 逻辑运算 和 算术运算。
二、逻辑移位
面向操作数类型:无符号整数。
规则:左、右移,都补0。高位的 1 移出时,溢出。
三、算术移位
面向操作数类型:有符号整数。需要考虑符号位的问题。
1. 原码 的算术移位
符号位:保持不变。仅对数值位进行移位。
规则:
- 左移:低位补 0,高位舍弃。 溢出:舍弃位为1。
- 右移:高位补 0,低位舍弃。 丢失精度:舍弃位为 1 。
2. 反码 的算术移位(了解即可)
(1)正数的反码与原码相同,故其算术移位完全相同(同上)。
(2)负数的反码移位运算与原码相反:
符号位:保持不变。仅对数值位进行移位。
规则:
- 左移:低位补 1,高位舍弃。 溢出:舍弃位为0。
- 右移:高位补 1,低位舍弃。 丢失精度:舍弃位为 0 。
3. 补码 的算术移位(重点)
(1)正数的补码与原码相同,故其算术移位完全相同(同上)。
(2)负数的补码移位运算:
符号位:参与运算。
规则:
- 左移:低位补 0,高位舍弃。 溢出:左移前后符号位不同。
- 右移:高位补 符号位,低位舍弃。 丢失精度:舍弃位为 1。
四、小结
1.只有补码的算术移位,符号位参与运算。
2.丢失最低位,可能丢失精度;丢失最高位,可能溢出。
3.除了补码右移,高位补符号位外,其余都是补0(不考虑反码的情况。)