黑马程序员技术交流社区

标题: 变量互换 请教! [打印本页]

作者: 睡不够的猪    时间: 2013-9-4 12:22
标题: 变量互换 请教!
本帖最后由 黄兴旺 于 2013-9-4 13:46 编辑

视频课里边有一个题目是这样的: 进行变量互换(要求不使用第三方变量)

老师写的是这样的:
    n=3,m=8;
    n=n^m;
    m=n^m;    //这个地方还能理解,相当于一个数两次异或同一个数,结果还是原来那个数,这样n的值就被赋予了m
    n=n^m;    //这里的n是表示原来的n 还是第一次变换之后的n呢?


作者: 王松松    时间: 2013-9-4 12:36
其实,n = n^m ,  m= n = (n^m)^m =n^m
那么,n = m = (n^m)^n = n^m
希望对你有帮助!
作者: 吴光新    时间: 2013-9-4 12:46
给你一个经典的:n=m+(m=n)-n
作者: 薛鹏鹏    时间: 2013-9-4 12:47
n=3,m=8;
    n=n^m;
    m=n^m;//  m = (n^m ) ^m =n
    n=n^m;  //  n = (n^m ) ^ n = m
作者: 肥猫    时间: 2013-9-4 12:52
  1. /**
  2. 功能:交换两个变量中的数值。
  3. */
  4. class TTT
  5. {
  6.         public static void main(String[] args)
  7.         {       
  8.                 //方法一
  9.                 System.out.println("方法一:");
  10.                 int a=5,b=3;
  11.                 System.out.println("转换前a="+a+","+"b="+b);
  12.                 a=a^b;
  13.                 b=a^b;
  14.                 a=a^b;
  15.                 System.out.println("转换后a="+a+","+"b="+b);
  16.                 System.out.println();

  17.                 //方法二:
  18.                 System.out.println("方法二:");
  19.                 int c=7,d=9,temp=0;
  20.                 System.out.println("转换前c="+c+","+"d="+d);
  21.                 temp=c;
  22.                 c=d;
  23.                 d=temp;
  24.                 System.out.println("转换后c="+c+","+"d="+d);
  25.                 System.out.println();

  26.                 //方法三:
  27.                 System.out.println("方法三:");
  28.                 int i=3,j=7;
  29.                 System.out.println("转换前i="+i+","+"j="+j);
  30.                 i=i+j;
  31.                 j=i-j;
  32.                 i=i-j;
  33.                 System.out.println("转换后i="+i+","+"j="+j);
  34.                 System.out.println();
  35.                 //方法四:
  36.                 int o = 3,m = 5;
  37.                 System.out.println("转换前o="+o+","+"m="+m);
  38.                 o = m + (m = o) - m;
  39.                 System.out.println("转换后o="+o+","+"m="+m);
  40.         }
  41. }
复制代码

作者: 黄兴旺    时间: 2013-9-4 12:56
  1. class  Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int n=3,m=8;
  6.                 n=n^m;//n的值变为11,m的值不变,还是8。
  7.                 System.out.println("n1="+n);
  8.                 System.out.println("m1="+m);
  9.                 m=n^m;//n的值还为11,m=(n^m)^m=(3^8)^8=3;
  10.                 System.out.println("n2="+n);
  11.                 System.out.println("m2="+m);
  12.                 n=n^m; //n=(n^m)^m=(3^8)^3=8,m=3;
  13.                 System.out.println("n3="+n);
  14.                 System.out.println("m3="+m);
  15.         }
  16. }
复制代码

作者: .....淡定    时间: 2013-9-4 13:14
肥猫 发表于 2013-9-4 12:52

方法一和方法三那个效率高啊。我一直以为方法三效率高

作者: EYE_SEE_YOU    时间: 2013-9-4 13:14
答案大家已经告诉你了
我就告诉你点别的吧
这个变量互换的技巧性较强
并且不需要第三方变量
所以一段时间前很受欢迎
虽然如此,但是它也有局限性
就是必须要保证两个变量不相等
否则其中一个变量会变成0
因此在实际开发中
大家用的是第三方变量的方法

作者: 睡不够的猪    时间: 2013-9-4 13:35
弄明白了 谢谢大家的解答和温馨提示,在这里就不做一一回复了 感谢感谢!{:soso_e183:}
作者: Development...    时间: 2013-9-4 19:33
看你的变量互换是使用亦或.这个是根据两个对象的值的二进制进行位移的手法




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