从二进制的角度出发:
右移操作符>>:
#include<stdio.h>
int main()
{
int a = 10;
int b = a >> 2;
printf("b=%d\n", b);
}
规则:右边抛弃,左边补0
针对一个正数10:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0010
故推算出计算方法为:b = a / 2 ^ n;
左移运算符<<:
int main()
{
int a = 10;
int b = a << 2;
printf("b=%d\n", b);
}
规则:左边抛弃,右边补0;
同样的例子10:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0010 1000
故推算出计算方法为:b = a * 2 ^ n;
提示:上述移位操作是针对正数而言成立
接下来以被移动的数为负数举例:
int main()
{
int a = -10;
int v = a >> 2;
printf("v=%d", v);
}
对于数-10而言:
原码: 1000 0000 0000 0000 0000 0000 0000 1010
补码 : 1111 1111 1111 1111 1111 1111 1111 0101(第一位不变,其余取反)
右移后 : 1111 1111 1111 1111 1111 1111 1111 1101
对于右移而言分为两种情况如下:
正数右移补0: +>> 0
负数右移补1: - >> 1
故-10空缺的位置由1来填充,移位结束后进行转换:
补码 - 1后取反变原码:
1111 1111 1111 1111 1111 1111 1111 1100
1000 0000 0000 0000 0000 0000 0000 0011
故运行结果为 - 3
上述操作移动次数较少,若移动超过32,结果会是0吗?答案显然是否定的,通过运行调试,我们得出结论:
真实移动次数:移动次数 &%32;
若移动次数为负数:
int main()
{
int a = 10;
int v = a >> -1;//>>31
int c = a << -2;//<<30
printf("v=%d\n", v);
}
得出结论:若向右(左)移动一个负数,则相当于沿同一方向移动比特位(32)+(负数);