文章内容主要为小册《程序员的必修课》的学习笔记以及个人理解,仅供个人学习使用。详细内容请支持正版小册
左移 <<
将所有数字向左边移动 n 位,右边补 0。
比如一个数是 101,左移 2 位就变成 10100。
左移操作的规律是,一个 N 进制的数左移 x 位,就相当这个数乘以 N的 x 次方倍。在 2 进制中,左移动 n 位,就等于乘以 2的n次方倍。
我们都知道,计算机一般只用加法器,乘法的效率比较低 ,基于上面的结论,我们可以实现计算机的乘法运算。比如要计算a * 7,由于 7 = 8 - 1,8 是 2 的 3 次方,所以可以计算为:a << 3 - a
右移 >>
将所有数字向右边移动 n 位,左边补符号位,正数就补 0,负数就补 1。
比如一个数是 0101,右移 2 位就变成 0001。
其中,负数的右移要以补码来计算。以 -5 为例:
- -5的原码是 10000101,变成反码就是 11111010,补码是反码+1,同时最高位为符号位,那就是 11111011
- 11111011 >> 1 = 11111101
- 对 11111101 再次求补码,也就是将 11111101 当做原码后,先计算反码:10000010,补码就是 10000011,所以就是-3。
但是,正数的右移运算等于做除法,负数的右移不等于做除法。所以,如果要计算负数的右移,得这样先使用正数做右移,完了再转成负数就行了。
还是-5,先转为正数 5,就是 0101,右移 1 位就是 0101 >> 1 = 0010,然后再修改符号位,变成 1010,得到-2 的原码
无符号右移 >>
无符号右移跟右移一样,只不过左边永远补 0。