Java 中的左移运算

我们知道 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时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值