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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

淮阴少年

中级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 淮阴少年 中级黑马   /  2015-3-6 21:25  /  3066 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
/*
        面试题:
                请自己实现两个整数变量的交换
                注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
class OperatorTest {
        public static void main(String[] args) {
                int a = 10;
                int b = 20;
               
                System.out.println("a:"+a+",b:"+b);
               
                //方式1:使用第三方变量(开发中用的)
                /*
                int c = a;
                a = b;
                b = c;
                System.out.println("a:"+a+",b:"+b);
                System.out.println("------------");
                */
               
                //方式2:用位异或实现(面试用)
                //左边:a,b,a
                //右边:a ^ b
                /*
                a = a ^ b;
                b = a ^ b; //a ^ b ^ b = a
                a = a ^ b; //a ^ b ^ a = b
                System.out.println("a:"+a+",b:"+b);
                */
               

最佳答案

查看完整内容

首先,a=a^b; // (10^20)算出a的结果为二进制11110,也就是10进制的30. 接着,b=a^b // a连续两次^同一个数(30^20),算出结果为10,赋予了b,也就是10 最后,a=a^b // a^b也就是(30^10),和上面的那个值已经不一样了,最终的结果是20.

11 个回复

倒序浏览
淮阴少年 发表于 2015-3-7 19:28
a=a^b;
b=a^b;//这里^后面的b值是20//那第一个b 不是被赋值10 了么
a=a^b;//这里的b的值是10 、、那既然 ...

首先,a=a^b;   //  (10^20)算出a的结果为二进制11110,也就是10进制的30.
接着,b=a^b   //  a连续两次^同一个数(30^20),算出结果为10,赋予了b,也就是10
最后,a=a^b   //  a^b也就是(30^10),和上面的那个值已经不一样了,最终的结果是20.

评分

参与人数 1黑马币 +10 收起 理由
心之所想 + 10 很给力!

查看全部评分

回复 使用道具 举报
        b = a ^ b; //a ^ b ^ b = a
                a  //a ^ b ^ a = b

b已经变a 那是不是表示 b已经 是10  
那第二行   a = a ^ b; //a ^ b ^ a = b  不是也是10?
不是很懂
回复 使用道具 举报
a=a+b;
b=a+b-b;
a=a-b;
System.out.println("a:"+a+",b:"+b);
                System.out.println("------------");
回复 使用道具 举报
a=a+b;
b=a-b;
a=a-b;
System.out.println("a:"+a+",b:"+b);
                System.out.println("------------");
回复 使用道具 举报
a=a^b
根据异或规则a=30
b = a ^ b; //a ^ b ^ b = a
b变成10
a=a^b//(a^b)^a=b
a=20
a与b交换
回复 使用道具 举报
a=a^b;
b=a^b;//这里^后面的b值是20
a=a^b;//这里的b的值是10
回复 使用道具 举报
金康俊 发表于 2015-3-7 10:44
a=a^b;
b=a^b;//这里^后面的b值是20
a=a^b;//这里的b的值是10

a=a^b;
b=a^b;//这里^后面的b值是20//那第一个b 不是被赋值10 了么
a=a^b;//这里的b的值是10 、、那既然第二行b=10  那这里的a不还是10  怎么变成20了

点评

所以你把数字都换成2进制的自己算一遍就知道了。  发表于 2015-3-7 19:40
回复 使用道具 举报
答案都被大家说了我就没啥说的了 加油吧各位
回复 使用道具 举报
One_M 中级黑马 2015-3-11 13:14:10
10#
a=a^b==>A     //相当于a=A(新二进制);
b=a^b=A^b=a^b^b=a  //b就得到a的值 b=a;
a=a^b=a^b^a=b  // a就相当于A^a  a=b;
这样就实现了a b对换;最好就是自己带数字进去多算几次就OK 了~! 开始我也没太懂~!~~  一起加油~
回复 使用道具 举报
又学会了一招,非常感谢楼主
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马