本文参考了京月飞鸿的《C语言中的左移与右移》
左移操作:
含义:
顾名思义就是把一个数的所有位都向左移动若干位,在C用用<<运算符标记
例:
int i = 1;
i = i << 2
1的二进制为00000001(这里用8位标示,不同系统,不同的位数),向左移两位,即把1向左移动两位,后面补两个0
即 00000100,转换成10进制就变成了4
需要注意的是,int类型为有符号的类型,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出
例:
int i = 0x40000000; //二进制位01000000000000000000000000000000
i = i << 1
i左移1位后变为0x80000000,符号位被置为了1,其它位全是0,变成了int所能表达的最小值,32位的int为-2147483648,溢出。
如果此时i再左移1位后,丢弃了最高为后,i变成了0
右移操作:
含义:
顾名思义就是把一个数的所有位都向右移动若干位,在C用用>>运算符标记
右移分为逻辑右移动和算术右移。
逻辑右移:
方法:
左边移入的位用0填充
int i = 150;//二进制为10010110
i = i>>2;
i向右移动两位,则最后面两位移除,最开始的添加两个0,变成00100101,十进制为37
算术右移:
方法:
左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0,则移入的位都为0,这样能够保持原数的正负数形式不变。
int i = 150;//二进制为10010110
i = i>>2;
i向右移动两位,原来的符号位即首位为1,即最后两位移除,最开始添加两个符号位,这里为1,即变成11100101,十进制为229
总结:
左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;
而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移