1.异或运算的规则:
0⊕0=0:两个0进行异或运算结果为0。
1⊕0=1:第一个数为1,第二个数为0进行异或运算结果为1。
0⊕1=1:第一个数为0,第二个数为1进行异或运算结果为1。
1⊕1=0:两个1进行异或运算结果为0。
我们一般把x异或y记为x xor y。
2.异或运算具有一些有用的性质,这些性质在编程中经常被利用。下面是异或运算的一些主要性质:
1.交换律:对于任意两个值 a 和 b,都有 a ^ b == b ^ a。即异或运算满足交换律。
2.结合律:对于任意三个值 a、b 和 c,都有 (a ^ b) ^ c == a ^ (b ^ c)。即异或运算满足结合律。
3.自反性:对于任意值 a,都有 a ^ a == 0。即一个值与自己进行异或运算结果为0。
4.零值:对于任意值 a,都有 a ^ 0 == a。即一个值与0进行异或运算结果为其本身。
5.恒等元:零值0是异或运算的恒等元,即 a ^ 0 == a,这与加法中的零元素的性质类似。
6.相同值的异或结果为0:对于任意值 a,都有 a ^ a == 0,这意味着相同的两个数进行异或运算结果为0。
7.异或运算满足分配律:对于任意三个值 a、b 和 c,有 (a ^ b) ^ c == (a ^ c) ^ (b ^ c)。即异或运算满足分配律。
这些性质使得异或运算在编程中具有广泛的应用,包括数据加密、校验、交换变量值、去重等方面。
3.什么是异或和
类似于把序列中的所有数加起来叫加和,我们也可以定义异或和,例如序列a1, a2, a3的异或和为
(a1 xor a2)xor a3。
4.异或前缀和
参考普通前缀和,定义一个前缀和数组为 s[n],令 s[i] = s[i-1]^a[i],则对于一个区间 [l,r]的异或和为 s[r]^s[l-1]。主要利用了 a ^ a = 0的这一性质。
通过异或前缀和,我们可以快速求出某一区间的异或和。
题目:
分析:
具体来说,按照给的参考例子,数组1 2 3 4 5,对应的s数组为0 1 3 0 4 1(s[0] ~ s[5])
s[0] = 0 = 0 0 0 0, s[1] = 1 = 0 0 0 1, s[2] = 3 = 0 0 1 1, s[3] = 0 = 0 0 0 0, s[4] = 4 = 0 1 0 0, s[5] = 1 = 0 0 0 1
显然只用考虑二进制的前3位,第1位为0 1 1 0 0 1,从第一个元素开始,1之前只有s[0]为0,所以贡献为1,第二个1前有0 和 1,0的数量为1,贡献为1 + 1 = 2,第三个0前面有两个1,贡献为2 + 2 x 1 = 4,第四个0同样,贡献为4 + 2 x 1 = 6,最后的1前面有3个0,所以二进制第一位的总贡献为6 + 3 * 1 = 9。同理,二进制第二位,第三位的贡献为10 和 20,这样算出来区间和为39
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/3268.html