移位运算
1.1算数移位
- 源码的算术移位:符号位置保持不变,仅对数值进行移位
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于/2,若舍弃的不等于0,就会丢失精度
把0000101.0 向右移动一位 000010.1 小数点后面的会1被舍弃,导致精度不足
左移:低位补0,高位舍弃,若舍弃的位=0,相当于*2,若舍弃的位不等于0,则会严重丢失精度
- 反码的算术移位
正数的反码与原码相同
右移:高位补0,低位舍弃 左移:低位补0,高位舍弃
负数的反码与原码相反 右移:高位补1,低位舍弃 左移:低位补0,高位舍弃
- 补码的算术移位
正数的补码 右移:高位补0,低位舍弃 左移:低位补0,高位舍弃
负数的补码=反码末尾加1 右移:高位补1,低位舍弃 左移:低位补0,高位舍弃
左移相当于x2,右移相当于除2
因为位数有限,无法用算数移位精确的等效乘除法
1.2 逻辑移位
逻辑右移: 高位补0,低位舍弃
逻辑左移:低位补0,高位舍弃
Eg:在颜色代码中RGB(102,139,139) 二进制代表(01100110,100001011,10001011)
1.3 循环移位
在做一些运算时,数值会溢出,多出一个进位
在进行循环移位时,右移会将原本的进位放在末尾的位置,新进的溢出位,代替原本的进位
变成