ビット演算による2つの変数値の交換機能
一般的な交換方法
2 つの変数 a と b を交換する通常のプロセスは次のとおりです。
int temp;
temp=a
a=b;
b=temp;
上記の 3 番目の一時変数 temp を使用する必要があります。
ビット単位のスワップ方式
次の方法を使用すると、2 つの整数 a と b が与えられた場合、次の XOR 演算により、3 番目の一時変数に頼らずに a と b の交換を実現できます。
a = a ^ b;
b = a ^ b;
a = a ^ b;
3 番目の一時変数に頼らずに 2 つの変数を交換するこのプロセスは、主に XOR 演算の次のプロパティに基づいています。
-
変数 X はそれ自体と XOR 演算され、結果は 0、つまり X^X=0 になります。
-
変数 X は 0 と XOR 演算され、結果は変更されません。つまり、X^0=X となります。
-
XOR 演算は結合的です。つまり、 a b c=(a b) c=a (b c)
-
XOR 演算は互換性があります。つまり、a b=b a
ビット操作方法の分析:
-
ステップ 1:
a = a ^ b;
完了後、変数 a の結果は次のようになります。a ^ b
-
ステップ 2:
b = a ^ b;
このとき、代入番号の右側の a には a ^ b の値が格納されており、次に代入番号の右側の a を a ^ b に置き換え、2 番目のステップの演算後の b の値
が(a^b)^b = a ^(b^b) = a^0 = a,
a は a、つまり b = a、a を b に代入します -
ステップ 3:
a = a ^ b;
このとき、割り当て番号の右側の a の値は変更されa ^ b
ずに保存されますが、割り当て番号の右側の b はすでに a であり、割り当て番号の右側の a と b はそのまま保持されます。代入番号がそれぞれ置き換えられます。つまり、
このときの代入番号の右側a^b =(a^b)^a = a^b^a = a^a^b = 0^b = b
、値が a に代入されます。つまり、a=b
3 番目のステップの操作の後、a の値は b、つまり a=b、そして b は a に置き換えられます。
このように、上記の3ステップにより、3番目の一時変数に頼ることなく、2つの変数a、bを交換する処理が完了する。
理解できない場合は、例を挙げて理解することができます。