楼主:
ptt0720 (湿湿)
2017-11-23 15:19:28※ 引述《ptt0720 (湿湿)》之铭言:
: 语言:CPP
: 今天写quick sort的时候发现原本常用的交数值方法好像有观念上的问题
: https://i.imgur.com/GwH4NbM.png
: 我习惯的用法是第二十七行 直接用参考交换两个值
: 但是发现印出来后都是一堆0
:
我简单归纳一下讨论结果 如有不对请再补充
XOR拿来交换是可以的 但是如果要换阵列的元素 内存位置不能一样
如果 a = 0x0001 value = 3
b = 0x0001 value = 3
经过一次XOR之后 0x0001 ^ 0x0001 结果会是 0x0001
作者:
galic (嘎利)
2017-11-23 15:56:00you got it
楼主:
ptt0720 (湿湿)
2017-11-23 16:16:00谢谢大大
作者: jerryh001 2017-11-23 20:43:00
阵列的元素"位置"不是可以交换的东西
作者:
CaptainH (Cannon)
2017-11-24 10:18:00xor交换其实是比正常swap慢的因为正常swap只要三次赋值,xor交换还有额外三次xor运算总之是语义有歧义,执行有风险,无法一般化,速度反而慢的做法
作者:
galic (嘎利)
2017-11-24 11:16:00但从pipeline CPU角度来看 Execute跟Write-back本来就不同stage 所以楼上C大说的理由不太完整....以前的ISA是真的有特殊理由去刻意使用XOR,但这都是历史了从现在的角度来看 XOR Swap的缺点主要是 可读性 以及编译器是否能理解XOR Swap,然后优化成合适的指令然后提一下,从计组的观点,目前XOR Swap的缺点应该是XOR必须经过运算才能得知结果 这会影响硬件能做的优化像是Branch Prediciton和Speculative Excution之类的所以这年头使用适当的算法跟资料结构 其他交给编译器就好
作者:
Lipraxde (Lipraxde)
2017-11-24 13:39:00这样换就省了点RAM看起来帅而已