A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贺靖轩 中级黑马   /  2013-4-1 08:25  /  2594 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

咋是爽快人,废话不多说。
代码:
public static void main(String[] args)
        {
                int x=3,y=4;
                change(x,y);
                System.out.println(x);
                System.out.println(y);
        }
        public static void change(int x,int y)
        {
                x^=y;
                y^=x;
                x^=y;
                System.out.println(x);
                System.out.println(y);
               
        }

输出:
4
3
3
4

求实现功能的方法和解释。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

8 个回复

倒序浏览
好吧。。。我给你解释一下吧...
int x = 3 , y = 3   是在main栈区里面存储的。
change(x,y); 这个函数里面的x,y是存在change栈区里面。mian方法中的变量作为参数值传入change方法区的。无论change中的x,y怎么改变,对main()里面的x,y没有任何影响。
有个很好的例子:
孙悟空可以复制很多的孙悟空,这些孙悟空可以杀妖降魔,被杀,但这些被复制的孙悟空,和真正的孙悟空本身没有任何影响。java疯狂讲义,讲的很详细。
还有一中方法可以通过change改变main里面的x,y值。不说了

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
滔哥 + 1
贺靖轩 + 3

查看全部评分

回复 使用道具 举报
自己学习了!

评分

参与人数 1黑马币 +1 收起 理由
贺靖轩 + 1 给个酱油钱 qiaosu

查看全部评分

回复 使用道具 举报
似水像火 发表于 2013-4-1 08:54
好吧。。。我给你解释一下吧...
int x = 3 , y = 3   是在main栈区里面存储的。
change(x,y); 这个函数里面 ...

恩 你说的我大概懂 关键我是不知道CHANG方法该如何实现
回复 使用道具 举报
public static void main(String[] args)
    {
            int x=3,y=4;
            
            change1(new Integer(x),new Integer(y));
            //因为change(x,y)是值传递,相当于在在change方法里面进行了修改,只局部有效,退出方法
            //后本身并没有变化
            System.out.println(x);
            System.out.println(y);
    }
    public static void change(int x,int y)
    {
            //此处是采用异或(将两个数的二进制形式每位异或,相异为1,相同为0) 方式交换数据,效率比较高的一种
            // x= 3 ---> 0011  x=4 --->0100
            x^=y;   // 0011^0100 ---> x=0111 y=0100
            y^=x;   // 0111^0100 ---> y=0011 x=0111
            x^=y;   // 0011^0111 ---> x=0100
            //x= 0100  4
            //y= 0011  3
            System.out.println(x);  //4
            System.out.println(y);  //3
            
    }
Java传值与传引用的区别可以去看下
http://developer.51cto.com/art/201104/254715.htm

评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
滔哥 + 1
贺靖轩 + 4 好吧 我看下链接吧 我其实想要个写好的能实.

查看全部评分

回复 使用道具 举报
输出:
4
3
是因为在你的主函数main中的第二行change(x,y); 调用了互换位置的那个构造方法 你那个方法里有输出语句,所以先会输出 4 3 也就是两个数调换后的结果
3
4
这里是因为你的主函数里也有输出语句,就将主函数里的两个变量给输出了

                x^=y;
                y^=x;
                x^=y;
                System.out.println(x);
                System.out.println(y);

上面的交换位置用到了这么一个知识:一个数异或同一个数两次 值不变!
x^=y;     也就是x=x^y;
y^=x;    也就是y=y^x;  因为x=x^y; 将x=x^y带入y=y^x得到y=y^(x^y)  这里x和y异或了两次 结果还是x   y=x  位置互换
同理
x^=y;    也就是x=x^y;因为y=y^x; 将y=y^x带入x=x^y得到x=x^(y^x)  这里y和x异或了两次 结果还是y   x=y  位置互换
上面写的比较啰嗦   简单起来就是:
x^=y;  
y^=x;  --->y=y^x--->  y=y^(x^y)  --->y=x
x^=y;  --->y=y^x--->  x=x^(y^x)  --->x=y
这样位置就互换成功了!


评分

参与人数 3技术分 +1 黑马币 +9 收起 理由
张超 + 6
滔哥 + 1
贺靖轩 + 3

查看全部评分

回复 使用道具 举报
本帖最后由 熊永标 于 2013-4-1 09:04 编辑

第一句:(x^=y)=(x=x^y)也就相当于用x去异或y的结果给x
第二句:(y^=x)=(y=x^y)也就相当于把x有值给y,因为一数异或另一个数偶数次,结果为这个数.把这
                       两句拼起为就是:x^y^y,根据原理,结果就等于x了
第三句:(x^=y)=(x=y^x)也就相当于把y有值给x,把第二句和第三句连接起来就是:y^x^y,换下位
                       位就是:x^y^y,根据异或特点,结为为x
总之就是把x和y的位置置换.

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
滔哥 + 1
贺靖轩 + 3

查看全部评分

回复 使用道具 举报
change方法中两个值交换是利用了异或运算的可逆性
这是异或运算本身的性质决定的,这个性质常被用于加密算法

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
滔哥 + 1
贺靖轩 + 3

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马