c语言中有两个移位操作符——左移位“<<”和右移位">>".它们可以将一个值向左移和向右移。在左移位中,值最左边的被丢弃,而右边多出来的几个空位由0补齐。而右移在操作符同样,只是方向不同。一下例子以左移位操作符讲解。
猜想:
1若是移位数为负数怎么办,移还是不移?例如a>> -5,看下面代码实验
代码1:
#include <stdio.h>
int main(int argc, char **argv)
{
int a=3;
printf("%d",a<<-5);
return 0;
}
运行效果:
它是移了多少位呢?可以算出得到为左移27位。这个值为什么是这样的?不是移26或者25位。int是整型,一般 大多是32位的,所以可以看出移位数为负数的话那么真实移位数是32+负数。可以编个代码试试对不对;
代码2:
- <span style="font-size:18px;">#include <stdio.h>
- int main(int argc, char **argv)
- {
- int a=1;
- printf("%d",a<<27);
- return 0;
- }
- </span>
代码2中是将1移位27位则刚好和移位-5是相同结果。看官也可以试试别的数字和移位数
2若移位数本身大于操作数所占位数改如何?编个代码试试便知
- #include <stdio.h>
- int main(int argc, char **argv)
- {
- int a=3;
- printf("%d",a<<33);
- return 0;
- }</span>
上面代码所示将3左移位33位结果是6,为什么?以下结果为将代码改为a<<32,a<<34;
若是在改大些呢?以下为a<<64,a<<65,a<<66的结果
现在结果出来了,左移位的位数=a-32
由上面猜想可以得到移位的公式:实际移位数b=a-32*k;
右移也应该和左移一样。
注:以上试验基于gcc4.6.2 编译器所做。而实际移位数基于操作数的最大位数所得,故系统环境,编译器不同,实际移位数还是不同。所以基于移位操作符的程序移植难度较大