問題:求1到n這n個整數間的異或值,即 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 (t & 1) return t / 2u ^ 1;
return t / 2u ^ n;
}