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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 悟佛修道 于 2013-5-16 23:17 编辑

  int n = 3,  m = 8;


//不用第三方变量。
  //11 = 3 +  8;
  //3 = 11 - 8;
  //8 = 11 - 3;
  /*
  n = n + m;//如果n和m的值非常大,容易超出int范围。
  m = n - m;
  n = n - m;
这个方法从第一步开始n就是11了。第二步 第三步等式右边的n都是11也就是n+m


异或方法:
n = n ^ m;
  m = n ^ m;//(n^m)^m;
  n = n ^ m;//n ^ (n ^ m)
异或方法这里第一步 第二步都没话说。而第三步等式右边的n对应n   m对应n^m
第三步为什么n又变回原来的n了呢?而不是像上面一种方法那样依然是第一步那个n=n^m呢?

感觉这里好乱,一直没弄清楚。n在第二步又没改变,为什么到了第三步就变回原来的值而不是第一步赋的那个n^m??

7 个回复

倒序浏览
   n = n ^ m;
   m = n ^ m;//(n^m)^m;   //此时,m的值为n
   n = n ^ m;//n ^ (n ^ m)   //此时,该运算表达式即为n=n^m^n;就像小学学的交换律a*b=b*a一样,^也具有这样的特性:n^m=m^n,n=n^m^n因此通过位置的置换就出现了楼主看到的n ^ (n ^ m)  ,这样做只是为了看起来清晰明了,n仍是以第一步所赋的值在参与运算。
回复 使用道具 举报
本帖最后由 神之梦 于 2013-5-16 22:16 编辑

楼主明白两次异或之后等于原数么?
知道的话,那我们举例说下
假设:n=3,m=6;n^m=5;
现在将n^m之后的值传给n,即n=5,这就是n=n^m;
然后第二个m=n^m;  现在n=5,m=6,n^m=3,相当于之前的n=3,与m异或2次,现在又变为了3,但是这次是将3传给了m。
最后一个n=n^m;  现在m=3,n=5,n^m=6,相当于之前的m=6,与3异或两次,又变为6,传给n。


不知道我这么说楼主明白否!
回复 使用道具 举报
二楼的正解哦
回复 使用道具 举报
第三步n没有变回原来的n,第三步中,n的值就是n^m,由于第二步中,m的值是n,所以将m和n的值代入到第三步,所以n=n^m=(n^m)^n=(m^n)^n=m,不知道这样说明白没?
回复 使用道具 举报
打个比方:
男人 女人和人妖
假设 男人^女人=人妖   人妖^男(女)=女(男)  异或规则

男人 = 男人^女人 ------------>人妖                          a = a ^ b;      此时 男人变成 人妖  用  男人(人妖)表示
女人 = 女人^男人(人妖)------------->男人                  b = a ^ b;      此时 女人变成 男人  用  女人(男人)表示
男人(人妖)= 男人(人妖)^ 女人(男人)----------->女人    a = a ^ b;      此时 男人(人妖)变成 女人  用 男人(人妖)(女人)
上边例子可以看出  男人  先变成了  人妖  又变成了  女人。
                  女人  则是直接变成了  男人。
括号中的内容 就是括号 前边的  改变的 , 连个括号表示变了两次。
你看的懂了不???????


回复 使用道具 举报
第三步的n=n^m中的m不就是第二步的n^m啊。 n^n^m不就是m吗?
回复 使用道具 举报
翟宝海 发表于 2013-5-16 22:05
n = n ^ m;
   m = n ^ m;//(n^m)^m;   //此时,m的值为n
   n = n ^ m;//n ^ (n ^ m)   //此时,该运算 ...

晕!!! 我钻牛角尖了。一直认为毕老师的意思是第三步n对应n      m对应n^m
多谢点醒,也谢谢各位的回答,谢谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马