Java 中的左移运算

来源:互联网 发布:致富360是什么软件 编辑:程序博客网 时间:2024/05/17 03:15

我们知道 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.147483647E92147483647

上面结果的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时

0 0
原创粉丝点击