移位运算分为算术移位、逻辑移位、循环移位
算术移位
在算术移位中,通过扭转数码位和小数点的绝对地位,从而实现各个数码位的位权。
在各机器码的移位中,左移相当于 ×2
,右移相当于 ÷2
,但因为位数无限,会造成溢出,就无奈准确的等效乘除法。
原码的算术移位
原码的算术移位,符号位不参加移位,因为小数点是绝对固定的,所以将数码位进行左右挪动
-
左移,高位舍弃,低位补
0
- 如果舍弃的是
1
,会呈现重大误差 - 如果舍弃的是
0
,相当于×2
- 如果舍弃的是
-
右移,低位舍弃,高位补
0
- 如果舍弃的是
1
,会呈现精度问题 - 如果舍弃的是
0
,相当于÷2
- 如果舍弃的是
例:
舍弃的是 0
-
00101010
对应十进制为42
- 左移一位
01010100
对应十进制为84
- 右移一位
00010101
对应十进制为21
- 左移一位
舍弃的是 1
-
01010101
对应十进制为85
-
左移一位
00101010
对应十进制为42
- 如果机器位数够,不必舍弃,咱们来看下它移位后的值
010101010
对应十进制为170
170
和42
两个值的误差太大了
- 如果机器位数够,不必舍弃,咱们来看下它移位后的值
-
右移一位
00101010
对应十进制为42
- 不必舍弃,看下移位后的值
00101010.1
对应十进制为42.5
42.5
和42
两个值只是精度误差
- 不必舍弃,看下移位后的值
-
反码的算术移位
反码的算术移位
- 负数的反码算术移位和原码一样
-
正数的反码算术移位
- 左移,高位舍弃,低位补
1
- 右移,低位舍弃,高位补
1
- 左移,高位舍弃,低位补
例:
-
负数原码
00101010
对应十进制为42
-
反码
00101010
- 左移一位
01010100
- 右移一位
00010101
- 左移一位
-
-
正数原码
10101010
对应十进制为-42
-
反码
11010101
- 左移一位
10101011
- 右移一位
11101010
- 左移一位
-
为啥正数的反码在移位时是补 1
呢?
因为正数的反码是在原码的根底上取反,所以为了保障数值上的对立,原码移位时是补 0
,那反码就补 1
补码的算术移位
补码的算术移位
- 负数的补码算术移位和原码雷同
-
正数的补码算术右移
- 正数补码左移(同原码):低位补
0
,高位舍弃 - 正数补码右移(同反码):高位补
1
,低位舍弃
- 正数补码左移(同原码):低位补
例:
-
负数原码
00101010
,对应十进制为42
-
补码
00101010
,- 左移一位:
01010100
- 右移一位:
00010101
- 左移一位:
-
-
正数原码
10101010
,对应十进制为-42
-
补码
11010100
- 左移一位:
10101000
- 右移一位:
11101010
- 左移一位:
-
为啥正数补码移位会分状况呢?
能够从正数原码、反码、补码他们之间找法则,比方 -42
:
- 原码:
10101010
- 反码:
11010101
- 补码:
11010110
从左边开始数到第一个 1
的中央,1
(包含 1
)的左边同原码一样,右边同反码一样
- 左移,左边同原码一样,在左边 (低位) 补
0
- 右移,右边同反码一样,在右边 (高位) 补
1
总结
码制 | 补代码 | |
---|---|---|
负数 | 原码、反码、补码 | 0 |
正数 | 原码 | 0 |
正数 | 反码 | 1 |
正数 | 补码 | 左移补 0 |
正数 | 补码 | 右移补 1 |