我假设您知道异或^
运算的作用-如果将两个位设置为相同的值,则结果为0
-否则为1
. 因此,当我有两个一位数 A 和 B 时,A^B
如果 A 和 B 都是0
,或者两者都是 ,那么将是零1
。换句话说 - 和中的A
和B
是偶数...
现在让我们一次做这两位:C 和 D 是两位数。以下是可能的组合:
C D C^D
00 00 00 even
01 00 01 odd
10 00 10 odd
11 00 11 even
00 01 01 odd
01 01 00 even
10 01 11 even
11 01 10 odd
00 10 10 odd
01 10 11 even
10 10 00 even
11 10 01 odd
00 11 11 even
01 11 10 odd
10 11 01 odd
11 11 00 even
如您所见 - 每个实例中的操作将位数减少一半,1
如果您从奇数开始,则生成的位数是奇数(因为1
s 对抵消,但所有其他人都没有改变) .
现在应该很明显了,为什么当您从较大的数字(4 位、8 位、16 位)开始时,同样的事情仍然是正确的。本质上,您的算法从 32 位数字开始,并将其拆分为两个 16 位数字。通过摆脱“双1”,它将位数减少了一半;然后对剩下的一半进行操作,并重复直到只剩下一个位。通过测试该位是 1(奇数)还是 0(偶数),您将得到答案。
如果不清楚,类似的操作x ^= x>>16
实际上将前 16 位移动到后 16 位并在那里产生异或。它实际上并没有清除最高位,所以“留下了一个烂摊子”。但是该算法忽略了接下来的混乱。请参阅以下内容(为简单起见,从 8 位开始):
x = abcdefgh
x >> 4 = 0000abcd
new x = abcdijkl
x >> 2 = 00abcdij
new x = abmnopqr
x >> 1 = 0abmnopq
new x = astuvwxy
在此,最后一位数字y
是 和 的异或,r
而q
后者又是和 的异l,j
或k,i
;h,d
它们分别是、f,b
、g,c
和的 XOR e,a
。如您所见,您最终得到了所有位的异或;正如我上面解释的那样,这意味着“全偶数”或“全奇数”,具体取决于最低有效位现在是 a1
还是 a 0
。
我希望这会有所帮助。