1. 程式人生 > >(轉載)求1到n這n個整數間的異或值(O(1)演算法)

(轉載)求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;

}