ヒント - XOR を使用して元の定数交換を置き換えます

ヒント – 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)

おすすめ

転載: blog.csdn.net/abaidaye/article/details/126548312