我们知道 a<<b ,可以看成 a 乘以 2的b次幂
示例
long a = 0x3;
long b = 30;
long longLeft = a << b;
System.out.println(longLeft);
System.out.println(0x3 << 30);
System.out.println("-----");
System.out.println(Math.pow(-2, 31));
System.out.println(Integer.MIN_VALUE);
System.out.println("-----");
System.out.println(Math.pow(2, 31) - 1);
System.out.println(Integer.MAX_VALUE);
结果
3221225472
-1073741824
-----
-2.147483648E9
-2147483648
-----
2.147483647E9
2147483647
上面结果的e9,就表示乘以10的9次幂
通过上面的实例发现,在java中,运算的结果,受整数类型的限制
3<<30:
当为long时,a<<b 没有超界限 ,即二进制能表示到 64位,最高位为符号位,表值的为后63位,当最高位为1,后面全为0时,即是它的最小值:1的63次幂
当为int时,a<<b 超出了Integer的界限,即二进制只表示到32位, 最高位为符号位,表值的为后31位,当最高位为1,后面全为0时,即是它的最小值:1的31次幂
2的30次幂 在二进制中表示为 0100 0000 0000 0000 0000 0000 0000 0000
2的30次幂再乘以3,在二进制中,就是上面的再加上两次,那么加1次时最高位就会变成 1000 ....(略28个0) 再加1次变成 1100 ....(略28个0)
1100 ....(略28个0) integer只有32位,第32位同时表示符号,0表示正数,1表示负
这时表示的值是小于Integer的最小值的,需要去掉最高位表示的值,所以
余下的 100 ....(略28个0)才是值,即2的30次幂 ,符号为负 。 -1 * Math.pow(2, 30) 就等于 类型为integer时 3<<30
当a<<b (b>=32)时:
2的32次方 在二进制中,1 后面跟32个0 ,这时在integer中,,遵循上面的规律,超出32位的不算,只看到32个0,那就是0
即a<<32 就等于 a<<0 即 a 乘以2的0次幂
当比如左移33位就是先左移32位,再左移1位,所以有 a<<(b%32), 当b>=32时