在编程中,通常会遇到交换两个数据的问题这时我们通常会借助第三方变量来交换数据,那怎么才能不借助第三方变量来交换数据呢?

有一种解法如下:

a=a+b;

b=a-b;

a=a-b;

可以看到,这可以很巧妙的解决上述问题,但是有一个问题,这很容易造成数据溢出。如果ab的和大于65535,就会造成程序溢出,可见它的适用性不是很广。

这里还有另外一种算法,可以很好的解决上述问题,就是Xor(异或)。

Xor是位运算,算法为相同的为0,不同的为1,即0 Xor 1=1;0 Xor 0=0;1 Xor 0=1;1 Xor 1=0

    在一个Xor运算中,涉及到三个数,两个因子和一个结果,由Xor算法的性质,相同的为0,不同的为1,可以很容易的看出可以根据三个数中的任意两个推出第三个数。如:0 Xor 1=1这个异或运算,1 Xor 1=0,1 Xor 0=1。所以异或也可以作为简单的加密方法。

异或也可以用来不借助第三方变量来直接交换两个数据的值。Xor是位运算,所以对数字进行Xor运算时,都先转化为二进制来进行运算,并且不会溢出。

    这里举一个特殊的例子,假设数组a[2],其中a[0]=0a[1]=1,为了交换数字,可以这么写:

         a[0]=a[0]^a[1];

         a[1]=a[1]^a[1];

         a[0]=a[0]^a[1];

    也可以这么写:

         a[1]=a[0]^a[1];

         a[0]=a[1]^a[0];

         a[1]=a[1]^a[1];

    甚至可以写成:

         a[0]=a[0]^a[1];

         a[1]=a[1]^a[1];

    都发现可以交换a[0]a[1]的值,a[0]=1,a[1]=0

    但是如果a[0]=1,a[1]=0就会发现上述程序运行后的结果都是错误的,为什么呢?

    我想借助Xor的算法本质来说明这个问题,有上面可知Xor可以用来加密,且可以根据其中两个数便可推出第三个,则已知结果和另外一个因子便能知道另一个因子。我觉得可以理解为这两个因子互为原文和密钥(即都可以成为原文和密钥)。如果把密文比喻为锁,那这两个因子都可以成为钥匙来打开这把锁。所以要不借助第三方变量来交换数据,可以先用两个密钥(即两个因子,分别设为a1,a2)加密,得到密文(即结果,假设a1=a1^a2,则a1由密钥变为密文),其中a1密钥被替换为密文,则可以用a2密钥来解密文a1并把值赋给a2,便得到原来的a1,就使a2的值变为a1,在用a2来解密文a1并把值赋给a1,又会使得a1的值变为a2,则转化结束,具体的代码如下:

    a[0]=a[0]^a[1];

    a[1]=a[0]^a[1];

a[0]=a[0]^a[1];

注意:转化的顺序不能颠倒。

Xor也有许多其他有趣的用途。

本人无意间一个很小很小很小的发现,请大家多指导。