一時変数を使わない変数交換の3つの方法

二つの変数の値を入れ替えようとするとき、通常は一時変数を使って移し替える。

    tmp = a;
    a = b;
    b = tmp;

しかし、排他的論理和を使ってこんな入れ替え方をすると、一時変数を使わなくても入れ替えられる。

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

また、数値型の場合だと、両方を加算して逆順で引いていれかえる方法もある。

    a += b;
    b = a - b;
    a -= b;

ここまでは直感的に話は分かりやすい。また、ググるとでてくる程度の話だ。
http://www.programming-magic.com/20080518202023/


しかし、数値型の場合、下記で入れ替えることもできる。

    a = -(a + b);
    b = -(a + b);
    a = -(a + b);

↑とあるところでXOR交換について議論しているときに、
電卓をいじくりまわしていて上手くいった方法をベテランSE諸賢との議論の中で
整理していったらこんな式になったのだが、ここまで式を整理してみると
まったくどういう原理なのか見ても分からない式になっていることに驚く。
実に不思議な式だ。


PS: 友人らに大発見した!と自慢したところ、和から差を取るか和の負数をマイナスにして差をとるかの違いだけで
和から差を取る方法と変わらないとの指摘を受けてショボーン