左移 <<
i << j;◆ i中所有的位向左移动j个位置,而右边填入0
◆ 所有小于int的类型,移位以int的方式来做,结果是int
x <<= 1;
//等价于
x *= 2;x <<= n;
//等价于
for(int i = 0; i < n; i++)
{
x *= 2;
}右移 >>
i >> j;◆ i中所有的位向右移j位
◆ 所有小于int的类型,移位以int的方式来做,结果是int
◆ 对于unsigned的类型,左边填入0
◆ 对于signed的类型,左边填入原来的最高位(保持符号不变)
x >>= 1;
//等价于
x /= 2;x >>= n;
//等价于
for(int i = 0; i < n; i++)
{
x /= 2;
}【例】分别做两个signed和unsigned类型的变量
#include<stdio.h>
int main(int argc, const char* argv[])
{
int a = 0x80000000;
unsigned int b = 0x80000000;
printf("a = %d\n", a);
printf("a = %u\n", b);
printf("a >>= %d\n", a >> 1);
printf("b >>= %d\n", b >> 1);
return 0;
}我们可以看到,运行的结果中a和b分别做右移运算后其值并没有发生正负号的改变:
这就说明,如果要移位操作的数是正数,其右侧填充的是0;而如果要移位操作的数是负数,其右侧填充的是1;这样做就可以保证其移位运算的符号不发生改变。这一点特别要与左移运算区分,左移运算中不管变量的正负,右侧直接填充0!
移位未定义的行为
◆ 移位的位数不要用负数,这是没有定义的行为
x << -2; //NO!
版权声明:本文为lilejin322原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。