先来看一个案例。今天闲话不说,我们来看一个小例子。如何交换两个数字?问题当然很简单。交换两个数,传统的方法是引入一个中间变量。代码如下funcSwap(a,bint){temp:=a//将a的值赋给一个临时变量temp,temp就是a的值a=b//将b的值赋给a,nowa的值变成了b的值b=temp//然后把temp中保存的a的值赋值给b}相信上面的代码大家应该没问题,但是我们来增加题的难度。如果不引入第三个变量temp,是否可以实现两个数的交换呢?“我建议你先考虑两分钟再往下看。”其实很简单,代码如下:funcSwap(a,bint){a=a^bb=a^ba=a^b}相信你看到这段代码时应该和我有同感第一次,这到底是什么?????这样a和b的值就可以交换了吗?别着急,我们一点一点来分析。异或运算要想看懂上面的代码,首先要知道什么是异或运算。先看定义。如果a和b的两个值不一样,则异或结果为1。如果a和b的两个值相同,则异或结果为0。(这是什么鬼?)看不懂没关系,下面看例子:比如a=5,b=3。首先要把a和b转换成二进制,然后a=101,b=011。然后a和b进行异或运算,逐位比较。如果值相同,则对应位置异或运算的结果为0,如果值不同,则对应位置异或运算的结果为1。异或运算示意图所以a和b异或运算的结果是110,也就是6。异或运算也可以换个角度理解,即“无进位加法”,其实就是二进制加法,只不过加法的结果是没有携带。异或运算的特点:0与任意数N进行异或运算,结果为N。其实这个很好理解。任意数转换成二进制,每一位上的数不是0就是1,与0异或,0的前一个位置与0相同,结果为0,1的前一个位置与0不同,结果为1,所以运算后结果不变,如下图所示:任意数与0异或很容易理解,数N与自身异或,结果为0。N^N必须相同。根据异或运算的规则,结果中N^N的每一位都必须为0。很容易理解,任意数和自身的异或运算满足交换律和结合律,也就是说a^b^c运算和c^b^a是一样的。我们再看看开头的例子。对异或运算有了一定的了解后,再来看开头的例子:funcSwap(a,bint){a=a^bb=a^ba=a^b}第一步运算:a=a^b第二步操作:b=a^b因为第一步a=a^b,在第二步中,直接将a替换为a^b即可所以:b=a^b^b我们之前说过,“任意数对自身进行异或运算的结果为0”,所以b^b的结果为0,与上面等价。b=a^0上面我们也说过,“任意数与0异或等于自身”,所以:b=a^0=a第三步运算:a=a^b此时b已经计算为a,a=a^b(第一步操作赋值)所以第三步操作等价。a=a^b^a=0^b=b(操作细节同第二步)这样我们就可以交换两个变量,不用第三个变量。
