当您查看 的升序值的答案时,会出现一种数学模式n
。它看起来像一个有四个步骤的旋转。这是因为我们在将奇数和偶数异或成先前偶数和奇数结果的各种组合之间来回摆动。每一个连续的异或都会给我们带来四分之一的旋转。我将演示和解释。
让我们从头开始逐案检查n=1
:
00000001
请注意,这属于case 1
解决方案,其中返回的结果是 1。还要注意,这个值n
是奇数,所以它必然以 . 结尾1
。
现在,当我们计算 的解时n=2
,它将是前一个答案与 的新值异或的解n
:
00000001
^
00000010
--------
00000011
请注意,这属于case 2
解决方案,返回的结果是n + 1
. 另请注意,在这种情况下n
是偶数,必然以0
-- 结尾,因此当与前一个结果 1(奇数)异或时,我们只会翻转额外的位,因此任何类似情况下的结果同样总是n+1
对于下一个值, 的结果自然getXOROne2N(3)
是前一个结果,由 异或3
。有趣的是,这将我们清零:
00000011
^
00000011
--------
00000000
当我们考虑它时,这是有道理的。结果getXOROne2N(2)
是n+1 = 2+1 = 3
,所以很自然地,当我们将沿 ( ) 的下一个值异或时n+1
,它将取消所有有符号位回到 0。另请注意,这属于case 3
您提出的解决方案。
现在,getXOROne2N
只要我们在得到 0 之后计算下一个值,它就只是下一个值——4 也是n
如此getXOROne2N(4)
。
00000000
^
00000100
--------
00000100
请注意,这完全符合case 0
您提出的解决方案。
现在,因为与4
前一个结果 0 的异或是偶数,所以结果必然有一个尾随 0。因此,与折叠异或的下一个值 5 必须具有这个前一个位配置,但最后一位设置为 1 ,这意味着当我们将它与上一个计算结果进行异或时getXOROne2N(5)
,我们将取消除最后一位之外的所有内容并返回到 1:
00000100
^
00000101
--------
00000001
因此我们形成了我们的旋转。这之后的下一个将异或一个偶数并因此产生n+1
(奇数),然后下一个将取消0
(异或一个奇数以产生这个偶数结果),然后我们将得到下一个n
(它必须是偶数),因此在随后的奇数下一个值中进行异或运算将抵消除最后一个保持打开的所有位,再次产生 1。
这是一个恶性循环!但我认为相当整洁。