C++---之移位运算

 移位运算包含“逻辑移位”(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)

猜你喜欢

转载自blog.csdn.net/weixin_39609623/article/details/83316970