将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
例:a = a << 2 将a的二进制位左移2位,右补0,
左移1位后a = a *2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
public class MainClass { public static void main(String[] args) { long i = 1L << 3; System.out.println(Long.toBinaryString(i)); i = 1L << 63; System.out.println(Long.toBinaryString(i)); i = 1L << 64; System.out.println(Long.toBinaryString(i)); } }下面是输出的结果:
1000<pre name="code" class="java">1000000000000000000000000000000000000000000000000000000000000001
i = 3L << 63
If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f (0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive. If the promoted type of the left-hand operand is long, then only the six lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x3f (0b111111). The shift distance actually used is therefore always in the range 0 to 63, inclusive.
public class SF{ public static void main(String[] args) { new SF().sh(1,2); } public int sh(int a , int b){ return (a << 32); } }
javac SF.java javap -verbose SF > sfp.txt java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:CompileCommand=dontinline,*SF.sh -XX:CompileCommand=compileonly,*SF.sh SF > sfasm.txt pause
[Verified Entry Point] 0x01c92e50: mov %eax,-0x4000(%esp) 0x01c92e57: push %ebp 0x01c92e58: sub $0x18,%esp ;*iload_1 ; - SF::sh@0 (line 7) 0x01c92e5b: shl $0x0,%edx 0x01c92e5e: mov %edx,%eax 0x01c92e60: add $0x18,%esp 0x01c92e63: pop %ebp 0x01c92e64: test %eax,0x140100 ; {poll_return}
Java移位运算符 “<<” 作用及详解,布布扣,bubuko.com
原文地址:http://blog.csdn.net/zjx409/article/details/37569055