我们一般情况下交换两个变量a ,b的值都是采用类似下面的情况
int tmp = a;
a = b;
b = tmp;
这种情况实用且简单,但是我之前在书上看到一种很装逼的方法a^=b^=a^=b
,这里运用了按位异或操作符,由于^=是先计算右边再计算左边,所以首先是a = a^b
,然后是b = b^a
,但是这里的a要用前面的那个式子替换,也就变成了b = b^a^b
,而异或的性质是两个相同的数异或为0,任何数与0异或等于他本身,所以又化简为b = a
,最后计算最前面一个^=,也就是a = a^b
,这里等号右边的a要用第一个式子代替,而等号右边的b要用第二个式子代替,也就是变成了a = a^b^a
,最后化简就是a = b
,这样就完成了两个数的交换。不仅没有使用额外的空间,并且按位异或的效率也很高。当然这这能适用于整数
但是今天我却在使用这个的时候翻车了。是在写排序算法的时候,交换两个值使用这个,但是在这个算法中可能会对同一个值进行交换,不是说对相同值的两个数进行交换,而是对同一个值进行交换。这样会导致这个值最后变成0。