黑马程序员技术交流社区

标题: 将2个数字置换,要求不使用第三方变量,怎么做? [打印本页]

作者: wawsc5354524    时间: 2014-8-10 01:43
标题: 将2个数字置换,要求不使用第三方变量,怎么做?
老师说是使用什么异或3次就可以了,谁可以给我讲讲什么异或3次就置换了,有点想不明白~
作者: wawsc5354524    时间: 2014-8-10 01:45
第一种我知道是咋整,定义一个第三方的变量交换即可。关键是这第二种,不准使用第三方变量的哈
作者: 孤守星空    时间: 2014-8-10 07:50
我来拿经验
^是同为假,不同为真
即 a=a^b;
    b=a^b; //a^b^b=a
    a=a^b; //a^b^a=b

作者: 冷风    时间: 2014-8-10 08:26
这样看你是否清楚点。
a=a^b;
b=a^b;//(a^b)^b=a
a=a^b;//(a^b)^(a^b)^b=b
//一个数异或上另一个数两次就等于这个数
作者: bfl625    时间: 2014-8-10 09:50
异或三次,自己画画图,理解下啊,
作者: 柀堓椛開    时间: 2014-8-10 09:56
用异或  来实现
a=a^b;
b=a^b;
a=a^b;
作者: wyf20106    时间: 2014-8-10 10:00
来学习拉
作者: 舍我其谁    时间: 2014-8-10 10:02
跟楼主有同样的问题
作者: a6511631    时间: 2014-8-10 10:07
  1.         public static void main(String[] args){
  2.                 int a = 5 ;
  3.                 int b = 4 ;
  4.                 a=a-(b=a-b);
  5.                 b=b+a;
  6.                 System.out.println(a+"   "+b);
  7.         }
复制代码

作者: 想做开发    时间: 2014-8-10 10:09
昂  看一下  
作者: 想做开发    时间: 2014-8-10 10:18
昂  看一下  
作者: sunshine9091    时间: 2014-8-10 10:24
基础视频里不是有嘛,楼主得努力啊!
作者: Ezreal    时间: 2014-8-10 10:27
学习学习
作者: wawsc5354524    时间: 2014-8-10 14:46
  1.         public static void main(String[] args){
  2.                 int a = 5 ;
  3.                 int b = 4 ;
  4.                 a=a-(b=a-b);
  5.                 b=b+a;
  6.                 System.out.println(a+"   "+b);
  7.         }
复制代码

作者: cs8630323    时间: 2014-8-10 15:33
a=a-b
b=b+a
a=b-a
一样道理,这个好理解吧
作者: 玥夜    时间: 2014-8-10 16:54
视频里都有哎  你是来水经验的麽
作者: 如果有梦    时间: 2014-8-10 17:31
  1. public class Test1 {
  2.         public static void main(String[] args) {
  3.                
  4.                 int a= 3;
  5.                 int b =4;
  6.                 System.out.println("a = "+a + "    b = "+b);
  7.                
  8.                 a = a+b;
  9.                 b = a-b;
  10.                 a = a-b;               
  11.                 System.out.println("a = "+a + "    b = "+b);
  12.                
  13.         }

  14. }
复制代码

作者: jw在路途    时间: 2014-8-10 19:05
我也来看看~~
推荐4种方案,你任选一种理解:
    方式1// 设置一个第三方变量  x     你老师不允许用,那我就不推荐了


作者: jw在路途    时间: 2014-8-10 19:14
方式2//
a=a^b;  //这里吧a^b的值 复制给了 a,
b=a^b;  //a^b=a^b^b=a;   解释下:( 因为根据异或2次同一个数等于它本身的原理)这里的a指(a^b),
a=a^b; //a^b=a^b^a=b;   解释:看上一步骤,这里的b已经被上面的a赋值了,所以a^b  也就可以理解为 a^a,参照第一步,a之前被 a^b赋值。 所以结果就是 a^ (a^b) ==b; 这样通过异或就完成了不用第三方转换
    根据原理(一个数异或2次同一个数等于它本身);   你看看,希望你能快速理解
作者: jw在路途    时间: 2014-8-10 19:17
方式3//
给一个
int a=10;
int b=20;

a=a+b;  //a=30
b=a-b;  // b=10
a=a-b;   // a=30-10=20;
通过a,b加减运算,不需要第三方变量  可完成转换   
作者: 继续悲伤    时间: 2014-8-10 19:20
a=a^b;
b=a^b;
a=a^b;
因为同一个数被亦或两次得到的还是原来的那个数!
作者: jw在路途    时间: 2014-8-10 19:21
方式4//
同样给两个变量
int a=10;
int b=20;

a=(a+b)-(b=a);  //只需要一步 即可转换a,b 的值
分析:
(b=a),指把 a赋值给b,首先一步转换  
(a+b),值两数的和,
(a+b)-(b=a),指两数之和 减去 a (这里的a 是因为上面 b被a 赋值了) ,  结果就是b

转换成功~~~   
作者: 月夜小楠    时间: 2014-8-10 20:07
路过。。。
作者: caiyaoren    时间: 2014-8-10 20:19
看看异或就可以
作者: 毕业生    时间: 2014-8-10 20:37
^表示异或(XOR)。当且仅当a=b时,有a^b=0 。异或满足交换律和结合律:
交换律:a ^ b = b ^ a
结合律:(a ^ b) ^ c = a ^ (b ^ c)

另外,在异或运算中,0类似加法中的0:加法中 a + 0 = a,异或中,a ^ 0 = a

好了,有上述知识准备就可以来看你的题目了:

a = a^b; // 这句没什么可说的

b = b^a;
由于前一句改变了a,因此这里变为:
b = b ^ (a ^ b)
   = b ^ (b ^ a) (交换律)
   = (b ^ b) ^ a (结合律)
   = a                 (b ^ b = 0, a ^ 0 = 0)

a = a^b;
由于前两句的执行效果,这句变成:
a = (a ^ b) ^ a
   = (b ^ a) ^ a (交换律)
   = b ^ (a ^ a) (结合律)
   = b                (a ^ a = 0, b ^ 0 = b)

至此,完成a和b的交换



作者: 晋一峰    时间: 2014-8-10 20:46
一个语句实现  a=a+b-(b=a);
作者: 怀念黑海岸    时间: 2014-8-10 21:07
使用  与 逻辑运算运算
作者: 酋长第一    时间: 2014-8-10 21:26
一个数,被另一个数异或两次,还是他的本身
a=a^b;  
b=a^b; 此时a^b   原来的表达式就可以表示为 b=(a^b)^b=a
a=a^b;同理  a=a^a^b=b
作者: Justfeeling    时间: 2014-8-10 21:36
张老师的视频里有详细叙述
作者: dingpanbo    时间: 2014-8-10 22:01
还有一个用两数和的方法
作者: dingpanbo    时间: 2014-8-10 22:05
m=m+n;   n=m-n;    m=m-n;
作者: 复仇者联盟    时间: 2014-8-10 22:09
其实异或那个方法比较不错,至少它不会出错,通过加减那种方法可能会出现错误,得到的结果不一定是你想要的。
作者: 梧桐树下    时间: 2014-8-10 23:10
视频讲的很清楚
作者: happymouse    时间: 2014-8-10 23:13
楼上答得都不错
作者: 周峰峰    时间: 2014-8-10 23:14
jw在路途 发表于 2014-8-10 19:17
方式3//
给一个
int a=10;

不错!!!!!!!!
作者: 柠萌不    时间: 2014-8-10 23:45
异或就可以解决了
作者: 黄宝宝    时间: 2014-8-10 23:47
拿个真实的数来算一算不就哦了么
作者: M单色调    时间: 2014-8-11 00:13
这个挺有意思的,学习了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2