xorで値のスワップ
まあ、常識みたいなもんかもしれませんが、今かこうと思った。
void swap(signed &l,signed &r){ l ^= r; // L = R XOR L r ^= l; // R = R XOR (R XOR L) = (R XOR R) XOR L = 0 XOR L = L l ^= r; // L = L XOR R = (R XOR L) XOR (L) = R XOR (L XOR L) = R XOR 0 = R }
こうするべきなのか?
template <typename T> void swap(T &l,T &r){ l ^= r; r ^= l; l ^= r; }
こうか?
template <typename T> void swap(T &l,T &r){ l ^= r ^= l ^= r; // 副作用完了点とか未定義とかどうだったっけ }
もちろん、現実で2つの値を交換する場面で a^=b^=a^=bとかやってはいけませんよ。
(でも面倒な時は十分良いイディオムとなってくれるので、使うかも…)