Java运算符左移<< 、右移 >>

左右位移其实都是根据我们的数字转化为二进制来进行位移的具体的我会在下面为大家讲解

1.左移<<

就比如说我们在代码中创建一个Integer 类型的变量 先运用 Integer.toBinaryString()方法将其转化为二进制然后我们就能开始讲解这个左移位的运算符了

首先我写了以下代码

Integer i = 15;
		System.out.println("开始是" + i);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("**************i << 1*******************");
		System.out.println(i << 1);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i << 1转化为二进制" + Integer.toBinaryString(i << 1));
		System.out.println("**************i << 2*******************");
		System.out.println(i << 2);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i << 2转化为二进制" + Integer.toBinaryString(i << 2));
		System.out.println("**************i << 3*******************");
		System.out.println(i << 3);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i << 3转化为二进制" + Integer.toBinaryString(i << 3));

```这段代码运行结果是
开始是15
i转化为二进制是1111
**************i << 1*******************
30
i转化为二进制是1111
i << 1转化为二进制11110
**************i << 2*******************
60
i转化为二进制是1111
i << 2转化为二进制111100
**************i << 3*******************
120
i转化为二进制是1111
i << 3转化为二进制1111000

所以说左移位就相当于在我们转化成二进制之后在最后一位左移

其实到了这里我们就可以很清晰的看到我们的运行结果其实也是有规律的
然后 我写出了以下代码

Integer i = 15;
		System.out.println("开始是" + i);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("**************i << 1*******************");
		System.out.println(i << 1);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i << 1转化为二进制" + Integer.toBinaryString(i << 1));
		System.out.println("i*(2的一次方)" + i * Math.pow(2, 1));
		System.out.println("**************i << 2*******************");
		System.out.println(i << 2);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i << 2转化为二进制" + Integer.toBinaryString(i << 2));
		System.out.println("i*(二的二次方)" + i * Math.pow(2, 2));
		System.out.println("**************i << 3*******************");
		System.out.println(i << 3);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i >> 3转化为二进制" + Integer.toBinaryString(i << 3));
		System.out.println("i*(二的三次方)" + i * Math.pow(2, 3));
		
```这段代码运行结果是
开始是15
i转化为二进制是1111
**************i << 1*******************
30
i转化为二进制是1111
i << 1转化为二进制11110
i*(2的一次方)30.0
**************i << 2*******************
60
i转化为二进制是1111
i << 2转化为二进制111100
i*(二的二次方)60.0
**************i << 3*******************
120
i转化为二进制是1111
i >> 3转化为二进制1111000
i*(二的三次方)120.0

最后看到了 其实就是相当于i乘以2的N次方

2.右移>>

右移位就和左移位是一个道理大家可以运行下面的代码试一下

Integer i = 15;

		System.out.println("开始是" + i);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));

		System.out.println("**************i >> 1*******************");
		System.out.println(i >> 1);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i >> 1转化为二进制" + Integer.toBinaryString(i >> 1));
		System.out.println("i/(2的一次方)" + i / Math.pow(2, 1));

		System.out.println("**************i >> 2*******************");
		System.out.println(i >> 2);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i >> 2转化为二进制" + Integer.toBinaryString(i >> 2));
		System.out.println("i/(2的二次方)" + i / Math.pow(2, 2));
		
		System.out.println("**************i >> 3*******************");
		System.out.println(i >> 3);
		System.out.println("i转化为二进制是" + Integer.toBinaryString(i));
		System.out.println("i >> 3转化为二进制" + Integer.toBinaryString(i >> 3));
		System.out.println("i/(二的三次方)" + i / Math.pow(2, 3));

这个注意一下是向下取整的

3.总结

左移位相当于i乘以2的N次方
右移位相当于i除以2的N次方
具体的使用我记得在ArrayList的源码里的扩容机制用的就是这个移位运算符大家有机会可以去看一下ArrayList的源码(按住ctrl+鼠标左键点击)