の昇順の値の答えを見ると、数学的パターンが生じますn
。4段で回転しているような感じです。これは、奇数と偶数を xor して、前の偶数と奇数の結果のさまざまな組み合わせにする間を行ったり来たりしているためです。連続する xor ごとに、ローテーションの 4 分の 1 が表示されます。実演して説明します。
最初から始めて、ケースバイケースでこれを調べてみましょうn=1
:
00000001
case 1
これは、返される結果が 1 である解の範囲内にあることに注意してください。また、この の値n
は奇数であるため、必ず で終わることに注意してください1
。
ここで、 の解を計算するとn=2
、それは の新しい値で xor された前の答えの解になりますn
。
00000001
^
00000010
--------
00000011
case 2
これは、返される結果が であるソリューションの範囲内にあることに注意してくださいn + 1
。また、この場合n
は偶数であり、必然的に末尾が 1 になることに注意してください。つまり0
、前の結果の 1 (奇数) に xored すると、追加のビットをオンにするだけなので、同様の場合の結果は常に同様にn+1
次の値の場合、当然、 の結果getXOROne2N(3)
は前の結果であり、 によって xor され3
ます。興味深いことに、これは私たちをゼロに一掃します。
00000011
^
00000011
--------
00000000
これは、考えてみれば当然のことです。の結果はgetXOROne2N(2)
だっn+1 = 2+1 = 3
たので、( ) に沿った次の値に xor すると、当然のことながら、すべての符号付きビットがキャンセルされて 0 に戻ります。また、これは提示されたソリューションにn+1
該当することに注意してください。case 3
さて、0 を取得した後の次の値を計算するときはいつでも、次のgetXOROne2N
値になります。つまり、n
4getXOROne2N(4)
です。
00000000
^
00000100
--------
00000100
case 0
これは、提示したソリューションにうまく収まることに注意してください。
ここで、4
0 の前の結果への xor は偶数であるため、結果には必然的に後続の 0 があります。したがって、フォールドへの xor の行の次の値 5 は、この前のビット構成を持つ必要がありますが、最後のビットは 1 に設定されます。を計算する前の結果に xor するとgetXOROne2N(5)
、最後のビット以外はすべてキャンセルされ、1 に戻ります。
00000100
^
00000101
--------
00000001
したがって、私たちはローテーションを形成します。この次は偶数を xor してn+1
(奇数) を生成し、その次は (奇数を xor0
してこの偶数の結果を生成する) にキャンセルし、次の値を取得しますn
(これは偶数である必要があります)、したがって、次の奇数の次の値を xor すると、最後に残っているビット以外のすべてのビットがキャンセルされ、再び 1 が生成されます。
悪循環です!しかし、かなりきれいだと思います。