(转载)求1到n这n个整数间的异或值(O(1)算法)

转自http://www.cnblogs.com/flyinghearts/archive/2011/03/22/1992001.html

问题:求1nn个整数间的异或值,即 1 xor 2 xor 3 ... xor n

 

 f(x, y) xy的所有整数的异或值。

 

 f(2^k, 2^(k+1) -1) (注意文章中的 ^ 表示的是“幂”,xor 表示“异或”,or 表示“或”)

2^k  2^(k+1) -1 2^k个数,最高位(+k位)的1个数为2^k

 k >= 1,则2^k为偶数,将这2^k个数的最高位(+k)去掉,异或值不变。

因而 f(2^k, 2^(k+1) -1) = f(2^k - 2^k, 2^(k+1) -1 -2^k) = f(0, 2^k -1)

因而 f(0, 2^(k+1) -1) = f(0, 2^k -1) xor f(2^k, 2^(k+1) -1) = 0 (k >= 1)

 f(0, 2^k - 1) = 0 (k >= 2)

 

 f(0, n)  (n >= 4) n的最高位1是在+k(k >= 2)

f(0, n) = f(0, 2^k - 1) xor f(2^k, n) = f(2^k, n)

2^knn+1-2^k个数,最高位(+k)共有 m = n+1-2^k 1,去除最高位的1

 

n为奇数时,m是偶数,因而 f(0, n) = f(2^k, n) = f(0, n - 2^k)

由于n - 2^k  n同奇偶,递推上面的公式,可得:f(0, n) = f(0, n % 4)

 n % 4 == 1 时, f(0, n) = f(0, 1) = 1

 n % 4 == 3 时, f(0, n) = f(0, 3) = 0

 

n为偶数时,m是奇数,因而 f(0, n) = f(2^k, n) = f(0, n - 2^k)  or  2^k

也就是说,最高位1保持不变,由于n - 2^k  n同奇偶,递推上面的公式,

可得:f(0, n) = nn or  f(0, n % 4)   (nn n的最低2位置0)

 n % 4 == 0 时, f(0, n) = n

 n % 4 == 2 时, f(0, n) = nn or  3 = n + 1 (公式对 n = 2仍成立)

 

综上所述:

f(1, n)  =  f(0, n)  =

   n      n % 4 == 0

   1      n % 4 == 1

   n +1   n % 4 == 2

0      n % 4 == 3

 

代码:

unsigned xor_n(unsigned n)

{

 unsigned t = n & 3;

 if (& 1) return t / 2u ^ 1;

 return t / 2u ^ n;

}


作者:  flyinghearts 
出处:  http://www.cnblogs.com/flyinghearts/ 
本文采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值