XOR交换算法和使用第三个变量交换之间有什么区别吗?
Is there any difference between XOR swapping algorithm and swapping using third variable?
这两者之间有什么区别,比如一个更快还是更小?
使用一个优于另一个的好处?
使用 XOR 运算符进行交换
int a, b;
a ^= b ^= a ^= b;
使用第三个变量交换
int a, b, temp;
temp = a;
a = b;
b = temp;
XOR swapping
不清楚:大多数人不会理解你的代码在做什么,被认为是晦涩难懂。
自解释代码总是更好,所以除非存在巨大的性能问题并且基准测试证明 xor 方法更快,否则最好使用第三个变量。
(由于您正在读取未初始化的变量,因此您的两个代码段的行为都未定义)。
永远不要使用 XOR 交换。
你的方式 (a^=b^=a^=b;
) 实际上是 未定义的行为 因为你在 [=27= 之间多次修改一个变量]测序点。编译器保留吃你猫的权利
相信编译器会进行优化。
它只适用于整数类型。
如果 a
和 b
引用同一个对象,它将失败:如果您使用此方法交换通过地址传递的对象,例如void xorSwap(int *x, int *y)
,正确的实现需要一个 if
块。
这两者之间有什么区别,比如一个更快还是更小? 使用一个优于另一个的好处?
使用 XOR 运算符进行交换
int a, b;
a ^= b ^= a ^= b;
使用第三个变量交换
int a, b, temp;
temp = a;
a = b;
b = temp;
XOR swapping
不清楚:大多数人不会理解你的代码在做什么,被认为是晦涩难懂。
自解释代码总是更好,所以除非存在巨大的性能问题并且基准测试证明 xor 方法更快,否则最好使用第三个变量。
(由于您正在读取未初始化的变量,因此您的两个代码段的行为都未定义)。
永远不要使用 XOR 交换。
你的方式 (
a^=b^=a^=b;
) 实际上是 未定义的行为 因为你在 [=27= 之间多次修改一个变量]测序点。编译器保留吃你猫的权利相信编译器会进行优化。
它只适用于整数类型。
如果
a
和b
引用同一个对象,它将失败:如果您使用此方法交换通过地址传递的对象,例如void xorSwap(int *x, int *y)
,正确的实现需要一个if
块。