黑马程序员技术交流社区

标题: 异或换值,纠结到不行不行的。 [打印本页]

作者: 张扬123    时间: 2012-9-1 00:41
标题: 异或换值,纠结到不行不行的。
复习无意看到老毕的异或换值:
        n=n^m;
        m=n^m;相当于m=(n^m)^m
        n=n^m;相当于n=n^(n^m)
下面说问题。第一步把n^m赋值给了n,为什么第三步括号后面的n还是相当于n?第三步不应该是相当于
n=(n^m)^(n^m)么?
如果说是老毕第三步的原式写错了,应该是n=n^m相当于n=(n^m)^n?那第二步的时候n不是异或了两次m不是已经是原值了么?为什么第三步等号后面的又是n^m呢?每一种想法我都想到了不对的地方,到底是哪个理解错误了?求解答!纠结死我了。。。谢谢!
作者: 王金科    时间: 2012-9-1 01:06
a = a^b;
b = a^b;//这里相当于a^b^b 到这里,b的值和a的值相等了
a = a^b;//这里相当于a^b^a,a就是a^b,而b的值在上一步中已经和a相同了.所以b就是a

一个数异或另一个数两次,其结果还是自身
作者: 阳杰    时间: 2012-9-1 01:14
这样和你说吧:   
    int n = 3;  int m = 9;
        n = n^ m;   //3^9
        m = n ^ m;    //3^9   ^ 9  此时m=3,而n 还是3^9
        n = n ^m;    //3^9   ^  3   后面的这个3就是m
作者: 王舜民    时间: 2012-9-1 03:39
本帖最后由 王舜民 于 2012-9-1 03:45 编辑

看图说话

n=n^m;
m=n^m;
n=n^m;

int n=6,m=7;
n=n^m;  =>     n=6^7          =1   
m=n^m;=>        m=1^7          =6         
n=n^m;  =>       n=1^6          =7
















异或运算符特点.jpg (33.61 KB, 下载次数: 31)

异或运算符特点.jpg

作者: 杨千里    时间: 2012-9-1 05:40
哥们 这个问题很有意思,

        n=n^m;                                        //  这一步的意思是:n^m  并把它的值赋给 n,用第一个n用来记录n^m  ,第二个n是初始值                 故:   n= n^M;        这一步很容易理解
        m=n^m;相当于m=(n^m)^m      //    这一步相当于m=(n^m)^m,没错,这时就出现了两个问题,第一个问题容易看到那就是,  一个数异或 另外一个数2次,结果不变还是那个数。所以m=n^m,  相当于 m=(n^m)^m 它产生的结果就是m=n,把n的赋给m。 这个问题也可以看到,但是这一步又产生了另外一个问题,那就是 (n^m)^m 的结果是n,关键就在这里这个n是初始值n,不是上一步第一个n^M后的n,而是上一步中第二个n,初始值的n   。n又回到原来了。
不要被第一步n=n^m中第一个n所迷惑了

n = n^m;     //第三步n^m,               n的值没变,但m的值是n^m,              所以 相当于n^(n^m)


这是我的理解 ,希望对你有所帮助







      








作者: 魏-玉-彪    时间: 2012-9-1 07:36
本帖最后由 魏-玉-彪 于 2012-9-1 07:46 编辑

        n=n^m;   //    n=n^m;
        m=n^m;相当于m=(n^m)^m   //此时的m等于原来的 n    异或两次等于原值 (n^m)^m  这里的意思是,把n的值赋值给了m.
        n=n^m;相当于n=n^(n^m)    //此时的  n等于原来的n^m; 也就是第一行的。 此时的   m等于第二行的结果,也就是n,因为第二行的运算结果是m等于原来的 n  。所以,n^m=  原来的 n^m^原来的n .运算完以后,n 的值其实是原来的m  .这里把原来的m赋值给了n,完成了互换。

033904gkfh14fgk61tb6k2.jpg (33.61 KB, 下载次数: 22)

033904gkfh14fgk61tb6k2.jpg

作者: 孔德智    时间: 2012-9-1 09:48
前两步你理解是正确的,第三步 n=n^m  等号右边的n的值就是第一步的n^m ,m的值就是n(第二步完成了)。
所以n=n^m 等同于n= (n^m) ^n  毕老师为了美观吧,就写成了n=n^(n^m)
两者是一样的,都是m把n异或两次赋给了n
加油!
作者: 杨卫腾    时间: 2012-9-1 10:14
本帖最后由 杨卫腾 于 2012-9-1 10:15 编辑

file:///F:/newjava/day04

希望对你有用

异或交换图解.png (22.02 KB, 下载次数: 19)

异或交换图解.png

作者: 张扬123    时间: 2012-9-1 18:58
孔德智 发表于 2012-9-1 09:48
前两步你理解是正确的,第三步 n=n^m  等号右边的n的值就是第一步的n^m ,m的值就是n(第二步完成了)。
所 ...

我今天问老师了,7楼8楼正解!
作者: 张扬123    时间: 2012-9-1 18:58
杨卫腾 发表于 2012-9-1 10:14
希望对你有用

我今天问老师了,7楼8楼正解!
作者: 张扬123    时间: 2012-9-1 18:59
问题已解决!
作者: 张扬123    时间: 2012-9-1 19:00
王金科 发表于 2012-9-1 01:06
a = a^b;
b = a^b;//这里相当于a^b^b 到这里,b的值和a的值相等了
a = a^b;//这里相当于a^b^a,a就是a^b,而b ...

正解!

作者: 张扬123    时间: 2012-9-1 19:03
冰舞世界 发表于 2012-9-1 05:40
哥们 这个问题很有意思,

        n=n^m;                                        //  这一步的意思是:n ...

这个理解是错误的。我今天问老师了。2、3、7、8楼正解。
作者: 张扬123    时间: 2012-9-1 19:04
魏-玉-彪 发表于 2012-9-1 07:36
n=n^m;   //    n=n^m;
        m=n^m;相当于m=(n^m)^m   //此时的m等于原来的 n    异或两次等于 ...

正解!

作者: 杨千里    时间: 2012-9-1 20:19
呵呵,,顶




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