【发布时间】:2017-06-13 07:01:12
【问题描述】:
如果我使用具有相同值的 XOR 交换算法,交换不会失败:
#include <stdio.h>
int main()
{
int x = 10, y = 10;
x = x ^ y;
y = x ^ y;
x = x ^ y;
printf("After Swapping: x = %d, y = %d", x, y); // prints "After Swapping: x = 10, y = 10"
return 0;
}
如果我使用指针,交换失败(x 将为零):
#include <stdio.h>
void swap(int *xp, int *yp)
{
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x); // prints x == 0
return 0;
}
算法是否应该以相同的值失败?如果我只使用布尔代数,当我进行第一次异或运算时交换将失败(第一个参数将变为零)。
编辑:更清楚“失败”的含义
【问题讨论】:
-
“失败”是什么意思?不编译?产生错误的输出?让你的电脑着火了?
-
你考虑过别名吗? xp 和 yp 指向同一个对象。尝试使用两个变量(可能有 2 个不同的值:x 和 y 为 10 并不能告诉您值已被交换)。
-
您实际上应该避免通过异或进行交换。因为,对于相同的指针值以及
float或double值,它将失败。 -
您不能对
double或float数据类型进行按位运算。正确的?我在评论中这么说。因为,这不是答案,而是建议。 @MrSmith42