a^=b;
b^=a;
a^=b;
即a^=b^=a^=b;
只有在两个比较的位不同时其结果为1,否则为0即[两个输入相同时为0,不同时为1]
(异或原则:0 1 0 1
1 0 0 1
结 果:1 1 0 0
曾在网上看到有的朋友说a与b的值如果一样,即a=b时,这个算法不成立值会被清零,我们详细的分析一下数据交换的过程,我们以二进制来表示:如a=b=0101
a^=b; //a=a^b=0101^0101 结果a=0000
b^=a; //b=b^a=0101^0000 结果b=0101
a^=b; //a=a^b=0000^0101 结果a=0101
所以我们使用异或进行数据交换是完全成立的。
同时,我们以后也可以使用a^=a;进行清零操作。并且剧说效率更高,我们也可以进行这样的使用如:if(a^b==0) 比if(a-b==0)的判断效率更高
那么当我们如下使用异或运算时为什么会出错呢?
void exchange(int &a,int &b)
{a^=b^=a^=b; //错误的作法;
}
这种做法看上去不错,但我们不可能正确使用它.因为编译法则不允许同一个表达式两次修改一个变量的值;
这会引起不确定状态的结果.
void exchange(int &a,int &b) //正确的作法,不要写在同一个表达式
{ a^=b;
b^=a;
a^=b;
}