(轉載)求1到n這n個整數間的異或值(O(1)演算法)
轉自http://www.cnblogs.com/flyinghearts/archive/2011/03/22/1992001.html
問題:求1到n這n個整數間的異或值,即 1 xor 2 xor 3 ... xor n
記 f(x, y) 為x到y的所有整數的異或值。
對 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^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
當
綜上所述:
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 (t & 1) return t / 2u ^ 1;
return t / 2u ^ n;
}