黑马程序员技术交流社区

标题: 关于交换的一个问题 [打印本页]

作者: liuzhming    时间: 2013-7-22 18:50
标题: 关于交换的一个问题
本帖最后由 杨兴庭 于 2013-7-23 17:42 编辑

在对元素进行交换时,有一种方法如下所示,它的原理是什么?为什么可以这样做?
public class BooleanTest {
        public static void main(String[] args)
        {
int n = 3,m = 8;
                System.out.println("n="+n+",m="+m);
                n = n ^ m;
                m = n ^ m;//(n^m)^m;
                n = n ^ m;//n ^ (n ^ m)
                System.out.println("n="+n+",m="+m);
        }
}
作者: 王峰230321    时间: 2013-7-22 19:13
那个 加法的 你能看懂吗. ?
int a=1  int b=2
a=a+b;  b=a-b ;  a=a-b;

如果这个能看懂的话.  那么他俩的原理 是一样的.  
作者: liuzhming    时间: 2013-7-22 19:35
加法也不太明白
作者: Joesph    时间: 2013-7-22 19:51
原理就是一个数异或同一个数两次,结果还是那个数
我是这样想的,好理解
n=7 m=4
3=7^4
7=3^4 //(7^4)^4
4=3^7 // 3^(3^4)

作者: 王峰230321    时间: 2013-7-22 20:07
a=1  b=2      他俩要交换   
a=a+b;     运行到这步的时候,     a=a+b     那么 b不变 还是2   但是等号左边的a变了,  等号右边是1+2.  所有等号左边 的a变成了3  
b=a-b ;     运行到这步的时候 ,   b=a-b      先看等号右边,  a已经变成3了,   而b之前是2 ,  那么 3-2   变成了1    对吧. ?  1返回给等号左边的b  那么 b就变成了1 a还是3
a=a-b;       运行到这步的时候,  a= a-b      还是看等号右边,  这时候 a是3对吧 ?  b 是1 对吧. ?     那么 3-1  等于2  对吧. ?     把2返回给等号左边   那么 a就等于2了.   
由此得到了 交换的效果.       至于^   和+ 的道理是一样的.  不过 + 更好理解一些  你先看懂 这个 +  就会明白^ 了
作者: 董凯    时间: 2013-7-22 21:02
这个跟你的是一个样的:
public class BooleanTest {
        public static void main(String[] args)
        {
                int n = 3,m = 8;
                System.out.println("n="+n+",m="+m);
                n ^ =m;
                m^ = n ;
                n ^m=n;
                System.out.println("n="+n+",m="+m);
        }
}
那我亲自给你解析一下吧!
n ^ =m;同于n=n^m=3^8=0011^1000=1011=11;
m^ = n ;同于m=m^n=8^11=1000^1011=0011=3;
n ^=m;同于 n=n^m=11^3=1011^0011=1000=8;
所以求得n=8,m=3
明白
??、
作者: laiminghui    时间: 2013-7-22 21:23
本帖最后由 laiminghui 于 2013-7-22 21:26 编辑

我的理解是:十进制的数在计算机内存中是以二进制形式进行运算的," ^  "这是位运算符的其中一个,
位运算符我认为都把那些十进制的算转换成二进制数进行运算就很好理解了。
n = n ^ m;
m = n ^ m;//(n^m)^m;
n = n ^ m;//n ^ (n ^ m)

我尝试来说说,理解了就回复一个;


^  运算机制,简单说就是:两边相同结果是  false
                                     两边不同结果是  true
   
---------------------------------------------------------------------------------------------
n = 3,m = 8;
3的二进制是  : 0011
8的二进制是 :  1000
n = n ^ m;
     0 0 1 1
^  1 0 0 0
-------------------
     1  0  1 1  (它的十进制是11) 把它赋值给n n就等于11了
-----------------------------------------------------------------------------------------         
n = 1011 ,  m = 1000 ;
m = n ^ m
    1  0  1 1
^  1  0  0 0
-------------------
     0  0  1 1  (它的十进制是3)把它赋值给m m 就等于3了
-----------------------------------------------------------------------------------------
n = 1011 ,  m = 1011 ;
n = n ^ m
    1  0  1 1
^  0  0  1 1
-------------------
    1  0  0 0  (它的十进制是8)把它赋值给 n  n就等于8了
------------------------------------------------------------------------------------------
结果n = 8,m =3;实现了交换。

把它先转换成二进制来算,就很好理解了。其实就是二进制0和1的变换来达到运算的目的的。

作者: 薛鹏鹏    时间: 2013-7-22 21:46
本帖最后由 薛鹏鹏 于 2013-7-22 21:51 编辑

其实就是异或的特点:一个数异或同一个数两次,结果还是这个数。 比如n^m^m=n,看不懂的话 勉强相当于 n+m-m=n.
{
n = n ^ m;
m = n ^ m;//(n^m)^m;
n = n ^ m;//n ^ (n ^ m)   
}
这部分也就相当于
{
n = n ^m;//       n=n+m
m = n ^ m;//      m=(n+m)-m=n
n = n ^ m;//       n=(n+m)-n=m
}


可能比喻不太恰当,但是这样比较容易理解,希望对你有帮助
作者: 康大玮    时间: 2013-7-22 21:48
哥们,这个设计到计算机底层的一些东西,我不知道能不能让你明白。
1,计算机是2进制,只有0,1。也就是所用0和1来表示所有的数;
2,关于位的概念。用我的理解你可以联想的我们的生活当中的个十百千,当然
      计算机当中是 2º,2¹,2²,2³.......;
3,关于异或的概念。用大白话说就是相同的一位上的数字如果相同,结果是0,
     数字不同,结果是1;
4,一个数异或同一个数两次,结果还是这个数。
听不懂在联系我吧

QQ截图20130722213901.png (6.38 KB, 下载次数: 0)

QQ截图20130722213901.png

作者: 月亮人生    时间: 2013-7-22 22:03
原理:一个数异或同一个数两次,结果还是这个数。
int n = 3,m = 8;
System.out.println("n="+n+",m="+m);
第一步:n = n ^ m;
第二步:m = n ^ m;//此时的n=n^m   ,那么m=m^n=m^(n^m) =n(根据原理)
第三步:n = n ^ m;//此时的n=n^m(m还是原来的数) 这个n还是第一步的值,那么,n=n^m=(n^m)^m(这个m是第二步的新值,也就是原来的n值)=m

//这样就完成了交换了。

作者: liuzhming    时间: 2013-7-22 22:41
大家讲得很仔细,弄懂了,谢谢大家




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