在C++中,如果要交换两个变量的值,我们通常会创建一个临时数据以它为桥梁来交换。熟悉位运算的同学也会这么做:
int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
这样做省去了额外变量的创建,显得比较优雅。但是这么做有一个问题:如果&a==&b
,那么交换完后的a
与b
就都是0了,这是因为两个相同的数字按位异或的结果是0。因此,三次按位异或的方法只适用于交换两个不同的数字,所以,在一些算法设计中,为了避免一些神奇的bug,请避免使用三次异或。
在C++中,如果要交换两个变量的值,我们通常会创建一个临时数据以它为桥梁来交换。熟悉位运算的同学也会这么做:
int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
这样做省去了额外变量的创建,显得比较优雅。但是这么做有一个问题:如果&a==&b
,那么交换完后的a
与b
就都是0了,这是因为两个相同的数字按位异或的结果是0。因此,三次按位异或的方法只适用于交换两个不同的数字,所以,在一些算法设计中,为了避免一些神奇的bug,请避免使用三次异或。