値の交換コードで使用変数を減らしたい

概要

値の交換(Swap,スワップ)をするコードにおいて使用する変数を減らすことができる方法があるのでそれについて紹介します.よく知られた方法のみ紹介します.
Facebookシェア Twitterツイート LINEで送る このエントリーをはてなブックマークに追加
この章を学ぶ前に必要な知識
0
効果
  • 無駄な変数を使わずに二つの変数を交換します

解 説

C++
1
2
3
4
5
6
7
int a = 1;
int b = 2;
int tmp;
 
tmp = a;
a = b;
b = tmp;
愚直な値の交換
プログラムにおいて余計な変数を使用しなくて済むよく知られている方法を紹介します. それはビットのXORを用いる方法です.
値の交換コードで使用変数を減らしたい
XORの ・同一の物は打ち消す: a ^ a = 0 ・結合法則: (a^b)^c = a^(b^c) ・任意のaと0: a^0 = a からこの方法が問題ないとわかります.
XORによる値の交換について
C++
1
2
3
4
5
6
int a = 1;
int b = 2;
 
b ^= a; //bに(b^a)
a ^= b; //aにa^(b^a)→a^(a^b)→(a^a)^b→0^b→b = 2
b ^= a; //bに(b^a)^b→(a^b)^b→a^(b^b)→a^0→a = 1
左の交換プログラム 交換用の変数なしで実現している.
また同様な方法で足し算引き算で行う方法もあります.
他の方法
C++
1
2
3
4
5
int a = 1;
int b = 2;
b = a - b;
a -= b;    // a = a - (a-b) = b
b += a;   // b = (a-b) + b = a
足し算引き算による値の交換 この欠点は桁溢れ等に関して気をつけなくてはならない点です.XORはその点気にする必要がありません.あくまでbitレベルの演算を行っています.
この章を学んで新たに学べる
Comments

Reasons
>>隠す