问题:求1到n这n个整数间的异或值,即 1 xor 2 xor 3 … xor n

我们记
QQ截图20151227163719
为a到b之间所有数的异或(包括a和b)。

那么我们先来考虑

QQ截图20151227163919,一共是2^k个数。这2^k个数中,二进制中最高位为1的是第k+1位,且所有2^k个数的最高位均为1。

 

我们考虑k>=1,则2^k为偶数,最高位异或后为0,把这个数的最高位去掉,并不会影响QQ截图20151227163919的值,所以公式1

所以:QQ截图20151227164135
QQ截图20151227164150

对于QQ截图20151227164214,设n的最高位1是在第k+1位(k>=2),

QQ截图20151227164249,对于2^k到n一共m=n+1-2^k个数,最高位共有m=n+1-2^k个1。
(1)当n为奇数时,m=n+1-2^k为偶数,根据公式1,可以进一步化为:QQ截图20151227164359 由于n-2^k和n都是奇数,递推上面的公式,可以得到QQ截图20151227164514

为什么会得到这个公式?QQ截图20151227164359相当于把n去掉其最高位,经过多轮递推后,n只剩下两个位,为什么剩下两个位?因为k>=2,所以剩下的两位无法再进行递推。又因为n为奇数,所以n不是1就是3,写成通项公式的话,就是QQ截图20151227164514

所以最终有:
QQ截图20151227164607

(2)当n为偶数时,m=n+1-2^k为奇数,则最高位共有奇数m=n+1-2^k个1,QQ截图20151227164650,最后和2^k相或,是因为最高位有奇数个1。

经过递推,我们可以知道,n二进制表示中,原来是1的位,依然是1,原来为0的位,依然为0,因为每次递推都会把当时最高位1保留下来,因为k>=2,实则相当于把n的前k-2为保留下来。

n的二进制表示为:QQ截图20151227164751n’记为:QQ截图20151227164822

,即把n的最后两位清零, 那么上述公式可以化为:

QQ截图20151227164840
即当n%4=0时,即n=n’,所以QQ截图20151227164906当n%4=2时,即n=n’+2,所以QQ截图20151227164940

综上所述:QQ截图20151227164958

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注