位运算-异或运算
1.性质
对于第五条进行解释, 可以看到如下例子, 四者异或运算结果位0(有1的位都出现了两次), 而 *i 也只是将位进行平移而已, 并不影响异或结果
011
010
001
000
2.补充
2.1 \(x \& (x-1)\) 去除最低位1
举例:
\(x = a10000;\) (a为高位部分)
\(x - 1 = a01111;\)
\(x \& (x-1) = a00000\)
这样就去除最低位1了
2.2 \(x\oplus(-x)\) 取最低位1
举例:
\(x = a10000;\) (a为高位部分)
\(-x = \bar{a} 10000;\) (取反加1, 01111 + 1 = 10000)
\(x\oplus(-x) = 010000\) 则只剩下最低位1了!
2.3 函数 sumXor\((x)\),表示 0\(\oplus1\oplus2\oplus\cdots\oplus x\)
因为以 4\(i\)为开头的连续四个整数异或的结果为 0(参考性质5),
所以 sumXor\((x)\)可以被表示为:
\(\begin{aligned}
\text{sumXor}(x)
&=
\begin{cases}x,
&x=4k,k\in Z\\(x-1)\oplus x,
&x=4k+1,k\in Z\\(x-2)\oplus(x-1)\oplus x,
&x=4k+2,k\in Z\\(x-3)\oplus(x-2)\oplus(x-1)\oplus x,
&x=4k+3,k\in Z&
\end{cases}
\end{aligned}\)
我们可以进一步简化
- 第一个原样
- \((x-1)\oplus x\), 由于x=4k+1,末尾为1,而\((x-1)\oplus x = ...1\oplus ...0 = 0...1 = 1\)
- \((x-2)\oplus(x-1)\oplus x\) 中x=4k+2,所以\((x-2)\oplus(x-1) = 1\), \(1\oplus x = x + 1(x=4k+2,末位为0,所以异或末位加1)\)
- 这个参考上面的性质5即可
\( \text{sumXor}(x)= \begin{cases}x, &x=4k,k\in Z\\1, &x=4k+1,k\in Z\\x+1, &x=4k+2,k\in Z\\0, &x=4k+3,k\in Z \end{cases} \)