追加の変数を使用せずに 2 つの値を交換するにはどうすればよいですか?

原理

まず、XOR (^) の計算を知る必要があります。同じは 0、差は 1 です
したがって、XOR 計算の結果は、2 つの値の特徴を組み合わせたものと等価です。このことから、2 つの同一の値を XOR 演算すると、結果が 0 になること
もわかります

実戦

一時変数を使用せずに、a と b の値を数値 = [a, b] で直接交換する関数を作成します。
例:
入力:数値 = [1,2]
出力:[2,1]
ヒント:
数値.length == 2

public int[] swapNumbers(int[] numbers) {
    
    
        numbers[0]=numbers[0]^numbers[1];
        numbers[1]=numbers[0]^numbers[1];
        numbers[0]=numbers[0]^numbers[1];
        return numbers;
    }

解析する

なぜこのように 2 つの値を交換できるのかと混乱していると思います。
それでは、上記の 3 つのステップを詳しく見てみましょう。

  1. 2 つの値 a と b の XOR 計算を実行し、2 つの値の差を取得します。つまり、固有値は a と等しくなります。
  2. a と b で XOR 計算を行います。前述したように、2つの同じ値をXORすると0になりますが、これはXOR計算そのものの原理によって得られる結果であり、自分で計算することもできます。b が削除されているため、この計算の結果は a の元の値になります。b がこの値と等しいとすると、b の値は a の元の値になります。
  3. a ^ b ^ b=a
  4. もう一度 a と b の XOR 計算を行うと、a の値は a^b の元の結果、b の値は a の元の値になります。したがって、このようにXOR演算を行うと、aの値が消去され、元のbの値が得られます。
  5. a ^ b ^ a=b
  6. これで 2 つの値の交換が完了しました。

おすすめ

転載: blog.csdn.net/weixin_43589025/article/details/110311094