移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。
逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。
算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。
1、如果是无符号数,不管是左移还是右移都是“逻辑移位”
2、在计算机中,数值是以补码来表示和存储的。所以移位运算都是在“补码”上进行操作的。
原码转补码
正数的补码与原码相同。
负数的补码:符号位为1,其余位是原码按位取反(反码),然后整个数加1。
补码转原码
补码的符号位为0,正数的原码=补码
补码的符号位为1,负数的原码=补码的补码。即符号位不变(1),其余各位取反,再加1.
-5的源码:
1000 0101
补码:
1111 1011
按位右移:
cout << (-5>>1) << endl;
补码左移:1111 1011 -> 1111 1101
输出源码,1111 1101的原码为:
1000 0011 (十进制:-3)
按位左移:
cout << (-5<<1) << endl;
补码左移:1111 1011 -> 1111 0110
输出原码:1111 0110 -> 10001010 (十进制:-10)