原理
まず、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 つのステップを詳しく見てみましょう。
- 2 つの値 a と b の XOR 計算を実行し、2 つの値の差を取得します。つまり、固有値は a と等しくなります。
- a と b で XOR 計算を行います。前述したように、2つの同じ値をXORすると0になりますが、これはXOR計算そのものの原理によって得られる結果であり、自分で計算することもできます。b が削除されているため、この計算の結果は a の元の値になります。b がこの値と等しいとすると、b の値は a の元の値になります。
- 即 a ^ b ^ b=a
- もう一度 a と b の XOR 計算を行うと、a の値は a^b の元の結果、b の値は a の元の値になります。したがって、このようにXOR演算を行うと、aの値が消去され、元のbの値が得られます。
- 即 a ^ b ^ a=b
- これで 2 つの値の交換が完了しました。