XOR交换算法和使用第三个变量交换之间有什么区别吗?

Shu*_*ubh 1 c swap xor

这两者之间有什么区别,比如一个更快还是更小?使用一个在另一个上的好处?

使用XOR运算符进行交换

int a, b;
a ^= b ^= a ^= b;
Run Code Online (Sandbox Code Playgroud)

使用第三个变量进行交换

int a, b, temp;
temp = a;
a = b;
b = temp;
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 7

(由于您正在读取未初始化的变量,因此两个片段的行为都是未定义的).

不要永远使用XOR交换.

  1. 您拥有它的方式(a^=b^=a^=b;)实际上是未定义的行为,因为您在排序点之间多次修改变量.编译器保留吃猫的权利.

  2. 相信编译器进行优化.

  3. 它仅适用于整数类型.

  4. 如果a并且b引用相同的对象,它将失败:如果您使用此方法来交换通过地址传递的对象,例如void xorSwap(int *x, int *y),正确的实现需要if块.


blu*_*112 5

XOR swapping 目前尚不清楚:大多数人都不会理解你的代码在做什么,而且它被认为是神秘的.

自解释代码总是更好,所以除非存在巨大的性能问题并且基准测试证明xor方法更快,否则更喜欢使用第三个变量.