我们在看某些jdk的源码时经常能看到">>"(右移)、"<<"(左移)、">>>"(无符号右移),比如下面这段
1550050893(1).jpg
它们经常被用来扩充动态集合的大小,下面我们看段代码看下">>"、"<<"、">>>"都做了什么操作。
我们写下面这段代码,先看左移
public class Main2 {
public static void main(String[] args) {
Integer aValue =10;
show(aValue);
Integer leftMoveValue1 =aValue <<1; //左移1位
show(leftMoveValue1);
Integer leftMoveValue2 =aValue <<2; //左移2位
show(leftMoveValue2);
Integer leftMoveValue3 =aValue <<2;//左移3位
show(leftMoveValue3);
}
/**
* 打印数字对应的二进制字符串
* @param number
*/
public static void show(Integer number)
{
//打印原值
System.out.println(aValue);
//打印值对应的二进制
System.out.println(Integer.toBinaryString(number));
}
}
结果是:
10
1010
20
10100
40
101000
80
1010000
原来的值为10
左移一位值为10*2的1次方 20
左移两位值为10*2的2次方 40
左移两位值为10*2的3次方 80
体现在二进制上,是将二进制的低位补0,既为左移
接下来我们将左移变成右移,代码如下:
public class Main2 {
public static void main(String[] args) {
Integer aValue =10;
show(aValue);
Integer leftMoveValue1 =aValue >>1; //右边移1位
show(leftMoveValue1);
Integer leftMoveValue2 =aValue >>2; //右移2位
show(leftMoveValue2);
Integer leftMoveValue3 =aValue >>2;//右移3位
show(leftMoveValue3);
}
/**
* 打印数字对应的二进制字符串
* @param number
*/
public static void show(Integer number)
{
//打印原值
System.out.println(aValue);
System.out.println(Integer.toBinaryString(number));
}
}
结果是:
10
1010
5
101
2
10
1
1
原来的值为10
右移一位值为10/2的1次方 5
右移两位值为10/2的2次方 2
右移两位值为10/2的3次方 1
体现在二进制上,是将二进制的低位直接去掉,既为右移,右移n位相当于10/2的n次方
接下来我们将左移变成无符号右移,代码如下:
public class Main2 {
public static void main(String[] args) {
Integer aValue =10;
show(aValue);
Integer leftMoveValue1 =aValue >>>1; //无符号右边移1位
show(leftMoveValue1);
Integer leftMoveValue2 =aValue >>>2; //无符号右移2位
show(leftMoveValue2);
Integer leftMoveValue3 =aValue >>>2;//无符号右移3位
show(leftMoveValue3);
}
/**
* 打印数字对应的二进制字符串
* @param number
*/
public static void show(Integer number)
{
//打印原值
System.out.println(aValue);
System.out.println(Integer.toBinaryString(number));
}
}
结果是:
10
1010
5
101
2
10
1
1
原来的值为10
无符号右移一位值为10/2的1次方 5
无符号右移两位值为10/2的2次方 2
无符号右移两位值为10/2的3次方 1
同为整数10时,我们看不到右移和无符号右移的区别
于是我们把右移中的值10变更为-10,先看看右移结果
-10>>1
-10>>2
-10>>3
-10
11111111111111111111111111110110
-5
11111111111111111111111111111011
-3
11111111111111111111111111111101
-2
11111111111111111111111111111110
我们看到,负数右移仍然是将二进制的最低位直接去掉,但是保证了位数不变,在最高位补了1,负数的右移反而变大了
我们继续看看无符号右移
-10>>>1
-10>>>2
-10>>>3
-10
11111111111111111111111111110110
2147483643
1111111111111111111111111111011
1073741821
111111111111111111111111111101
536870910
11111111111111111111111111110
负数进行无符号右移时变成了很大的正数。相当于是将低位去掉后,在高位补了0,
我后来又试了一下 -1左移一位时,恰好为2147483648,正好为Interge.maxValue的值
先这样吧...
后记:
以后再也不怕在源码中看见左移右移了,其实自己都能算出来的
网友评论