左移<< 和 右移>> 是对二进制的位运算。使用位运算能提高效率,但不易阅读
左移右移的原理可以参考这两个博文
https://blog.csdn.net/onezg/article/details/53103559
https://blog.csdn.net/weixin_42837024/article/details/98734787
不在乎原理的话,左移右移是有通俗的使用方法的
一、正数
m左移n位,即m << n
结果:m x 2n
m右移n位,即m >> n
结果:m / 2n
例:
4 << 2 11 >> 2
= 4 x 4 = 11 / 4 (2.75)
= 16 = 2(若为小数,则向下取整)
二、负数
左移<< 和正数时一样
右移>> 时,若结果为小数,应向上取整
例:
-4 << 2 -11 >> 2
= -4 x 4 = -11 / 4 (-2.75)
= -16 = -3(若为小数,则向上取整)
其实负数 -3 < -2.75 , 则 -2.75 -> -3 其实也算向下取整。但我感觉向上取整更好理解一点。
补充一点:
Java中int的位数为32,因此若 左移运算符<< 右侧的数字大于32的话,实际运算的位移位数为其对32取余的数字。
例:int a = 1 << 34; a = 4
1 << 34
= 1 << (34 % 32)
= 1 << 2
= 1 x 4 = 4