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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 睡不够的猪 中级黑马   /  2013-9-4 12:22  /  1307 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄兴旺 于 2013-9-4 13:46 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

9 个回复

倒序浏览
其实,n = n^m ,  m= n = (n^m)^m =n^m
那么,n = m = (n^m)^n = n^m
希望对你有帮助!
回复 使用道具 举报
给你一个经典的:n=m+(m=n)-n
回复 使用道具 举报
n=3,m=8;
    n=n^m;
    m=n^m;//  m = (n^m ) ^m =n
    n=n^m;  //  n = (n^m ) ^ n = m
回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 赞一个!

查看全部评分

回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报

方法一和方法三那个效率高啊。我一直以为方法三效率高
回复 使用道具 举报
答案大家已经告诉你了
我就告诉你点别的吧
这个变量互换的技巧性较强
并且不需要第三方变量
所以一段时间前很受欢迎
虽然如此,但是它也有局限性
就是必须要保证两个变量不相等
否则其中一个变量会变成0
因此在实际开发中
大家用的是第三方变量的方法
回复 使用道具 举报
弄明白了 谢谢大家的解答和温馨提示,在这里就不做一一回复了 感谢感谢!{:soso_e183:}
回复 使用道具 举报
看你的变量互换是使用亦或.这个是根据两个对象的值的二进制进行位移的手法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马