左移:丢弃最高位,往左移位,右边空出来的位置补0
右移:右移有逻辑右移和算数右移
逻辑右移:丢弃最低位,向右移位,左边空出来的位置补0
算数右移:丢弃最低位,向右移位,左边空出来的位置补原来的符号位(即补最高位)
一、算数右移
int a = 1;
unsigned int b = (a << 31) >> 31;
整型a:0000 0000 0000 0000 0000 0000 0000 0001
左移31位后:10000000 00000000 00000000 00000000 最右侧直接补0
右移31位后: 11111111 11111111 11111111 11111111 a是有符号数,采用算术右移,最左侧补符号位,即1
最终b等于0xFFFFFFFF
二、逻辑右移
unsigned int a = 1;
unsigned int b = (a << 31) >> 31;
整型a: 00000000 00000000 00000000 00000001
左移31位后:10000000 00000000 00000000 00000000 最右侧直接补0
右移31位后:00000000 00000000 00000000 00000001 a是无符号数,采用逻辑右移,最左侧补0
三、移动的位数超过数字占有的位数
unsigned int a = 1;
unsigned int b = a << 33;
实际移动位数为 33 % 32 = 1,即左移1位,b = 2
参考文章:https://blog.csdn.net/yzf279533105/article/details/58642142?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase