移位运算
算术移位
例:985.211
小数点后移1位 => 9852.11 => 985.211 * 10^1
小数点后移2位 => 98521.1 => 985.211 * 10^2
小数点前移1位 => 98.5211 => 985.211 / 10^1
小数点前移2位 => 9.85211 => 985.211 / 10^2
通过改变各个数码位和小数点的相对位置,从而改变各个数码位的位权。可用移位运算实现乘法、除法
原码的算术移位:符号位保持不变,仅对数值位进行移位
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于除以2;若舍弃的位!=0,则会精度丢失
左移:低位补0,高位舍弃。若舍弃的位=0,则相当于乘以2;若舍弃的位!=0,则会出现严重误差

反码的算术移位
正数:正数的反码与原码相同,因此正数反码的移位运算也与原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
负数:负数的反码数值位与原码取反,因此负数反码的移位运算如下
右移:高位补1,低位舍弃
左移:低位补1,高位舍弃
补码的算术移位
正数:正数的补码与原码相同,因此正数补码的移位运算也与原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
负数:负数的补码数值位是反码末位+1,因此负数补码的移位运算中,找到反码最右边的数值0改为1,以1为中心,1的左边与反码相同,1的右边与原码相同
右移(同反码):高位补1,低位舍弃
左移(同原码):低位补0,高位舍弃
例:-20 * 7
7D = 1 + 2 + 4 = 111B = 2^0 + 2^1 + 2^2
-20 * 7 = -20 * (2^0(不移位) + 2^1(左移1位) + 2^2(左移2位))
算术移位中,不管是什么码,左移相当于乘以2,右移相当于除以2
由于位数有限,因此有时候无法用算术移位精确的等效乘除法
逻辑移位
逻辑右移:高位补0,低位舍弃
逻辑右移:低位补0,高位舍弃
例:RGB:102,139,139
R = 102 = 01100110
G = 139 = 10001011
B = 139 = 10001011
用3B存储R值的无符号数102,并逻辑左移16位:01100110 00000000 00000000
用3B存储G值的无符号数139,并逻辑左移8位:00000000 10001011 00000000
用3B存储B值的无符号数139,并逻辑左移0位:00000000 00000000 10001011
通过相加得3B的RGB值:01100110 10001011 10001011
可以把逻辑移位看作是对无符号数的算术移位
循环移位
循环左移:高位移出的1位,放置到低位空出的1位
循环右移:低位移出的1位,放置到高位空出的1位
由于加法运算最高位进位超出机器字长,自算计硬件会包含CF用于记录进位,不断往高位进行计算。
带进位循环左移:高位移入CF,低位存储原CF的数值
带进位循环右移:低位移入CF,高位存储原CF的数值