求1到n這n個整數間的異或值 (O(1)算法)

 

 

問題:求1nn個整數間的異或值,即 1 xor 2 xor 3 ... xor npost

 

記 f(x, y) 爲x到y的全部整數的異或值。blog

 

對 f(2^k, 2^(k+1) -1) (注意文章中的 ^ 表示的是「冪」,xor 表示「異或」,or 表示「或」):get

2^k 到 2^(k+1) -1 這2^k個數,最高位(+k位)的1個數爲2^k,it

若 k >= 1,則2^k爲偶數,將這2^k個數的最高位(+k位)去掉,異或值不變。class

於是 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)di

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

 

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

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

對2^k到n這n+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 中國大陸許可協議進行許可,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索