ヒント – XOR を使用して元の定数スワップを置き換えます
シーン再現
私たちが通常コードを書くとき、 sum の値を交換したい場合、次のコードをよく使用しますa
か?b
int temp = a;
a = b;
b = temp;
これは非常に基本的な交換方法であり、話題になっています。
しかし、最適化の観点から、temp
この変数を使用しないことを考えたことはありますか?
では、変数なしでスワップする方法は?
今日は主役である XOR 演算を使用します。
最初に結論を導き出します。今のコード行は、次のコードと完全に同じです。
a = a ^ b;
b = a ^ b;
a = a ^ b;
なぜ?聞いてください。
最初に XOR 演算について話しましょう
XOR 演算はバイナリに対する演算です。0 と同じ、1 とは異なります。例:
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
1 ^ 1 = 0
2 つの数値の演算の場合は、次のようになります。
4 ^ 5 =
4 0100
5 0101
------
0001
キャリーなしの加算とも呼ばれます。
同時に派生:
n ^ n = 0
n ^ 0 = n
同時 XOR は結合法則を満たします。
基礎を十分に築いた後は、その理由について話す時が来ました。
a の値を x に、b の値を y に設定します。したがって、上記は次のようになります。
a = a ^ b; //此时a = x ^ y b = y
b = a ^ b; //此时a = x ^ y b = x ^ y ^ y = x
a = a ^ b; //此时a = x ^ y ^ x = y b = x
a と b が入れ替わっていることに驚くでしょう。
これがXORの魅力です。
注: a と b が同じメモリ アドレスを指している場合、この方法には欠点があり、元の a と b は 0 にリセットされます。
ビット操作の詳しい解説と練習問題はこちら:「一度しか出ない数字」シリーズ ソードとは オファーのビット操作学習(1)