public class Test{static void leftshift(int i,int j){i<<=j;}public staic void main(String args[]){  int i=4,j=2;  leftshift(i,j);  System.out.println(i);}}
输出i为什么是4??
不明白啊!
i<<=j;这句话是什么意思嘛!
高手帮忙啊!

解决方案 »

  1.   

    java的参数传递有两种 
    1,基本类型,传递的是这个基本类型的副本,不会改变被传递参数的值 
    2,引用类型,传递这个对象的引用,可以改变这个引用所指向的值。i<<j 是移位操作里的左移操作,将i的二进制表示向左移动j个位
    比如
    int i=4,j=2
    二进制表示 00000000 00000000 00000000 00000100
    i<<j
    结果 00000000 00000000 00000000 00010000  =16 相当于 4*2^2=16
      

  2.   

    i是函数main里的成员变量,不会变
      

  3.   

    up.
    i < <=j ----> i = i<<j
      

  4.   

    static void leftshift(int i,int j){i<<=j;}
    中,i,j的生命周期在你调用完这个方法就结束了
      

  5.   


    LZ根本就不用考虑leftshift方法
    虽然你调用的时候传了i,j的值过去
    但是这个时候其实是传了一个副本过去
    也就是说i的值只在leftshift方法里发生变化
    这个方法又没有返回值
    所以并不影响main方法里的i,j的值
    如果lz还不太清楚地话,可以去网上看一下[变量作用域]的相关概念再说i < <=j
    这个是个移位操作
    就是说把i向左移动j位后的值再赋给i
    就相当于i = i<<j;
    运算的道理和
    i+=2一样关于移位运算,参考下面的例子public class Test3 { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub

    int i = 4, j=2;
    System.out.println("before i:"+Integer.toBinaryString(i));  //before i:100
    System.out.println("before j:"+Integer.toBinaryString(j));  //before j:10

    i<<=j; // 相当于i = i<<j;

    System.out.println("after i:"+Integer.toBinaryString(i));  //after i:10000
    System.out.println("after j:"+Integer.toBinaryString(j));  //after j:10 }}