异或交换算法

发布于 2022-08-27 12:04:01 字数 31 浏览 7 评论 0

有两个数A和B,现在不通过第三空间交换A和B。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

苦笑流年记忆 2022-09-03 12:04:01

首先,感谢@brayden和@kamushin的指导,之前我的理解是错误的,哈哈,留着被踩警示自己。重新补充一下自己的答案
为什么用异或前需要增加判断,是为了防止异或了同一变量,示例代码如下:

void swap(int *arr, int i, int j) {
    if (i != j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
}

当i==j时,如果不加判断会出现问题,原因是arr[i]和arr[j]都是指向同一变量,直接异或会将这个变量变为0

紫竹語嫣☆ 2022-09-03 12:04:01

这个题目好像很老了哦,貌似很多地方都有答案

A=A+B    A:A+B  B:B
B=A-B    A:A+B  B:A
A=A-B    A:B    B:A

这个是加法版的

a = a ^ b
b = b ^ a
a = a ^ b  

这个是异或版的

堇年纸鸢 2022-09-03 12:04:01

在位运算的代数系统中,^运算中 a的逆元仍是a,类比加法 a+(-a)=0 有 a^a=0。
这样想的话,位运算只是在模仿加法运算。

a=a^b  等价  a=a+b
b=a^b  等价  b=a+(-b)
a=a^b  等价  a=a+(-b)
想挽留 2022-09-03 12:04:01
if((&a) != (&b)){
   a^=b^=a^=b;
}//必须判断地址不同!
我不咬妳我踢妳 2022-09-03 12:04:01

list($b,$a)=array($a,$b);
php版...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文