在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变
左移:
当左移的位数不超过该数值类型的最大位数时:逻辑左移(补0,丢弃最高位)
当左移的位数超过该数值类型的最大位数时:编译器会用左移的位数去模类型的最大位数,然后按余数进行移位(只是执行:左移 所得的余数 个位数)
int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 只左移1位,i变成2
j = j << 33; // 33 % 32 = 1 只左移1位,j变成0,最高位1被丢弃
右移:>>
算术右移:保持符号位不变,正数的话补0,负数补1,(补符号位)
int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
>>> 向右移动的过程中,不管原来数的最高位是1还是0,都补0,所以我们应该根据需要来选择,右移是用>>>还是>>
参考:http://blog.youkuaiyun.com/tdcs111/article/details/61929445.