当前位置:网站首页 > 技术博客 > 正文

异或和怎么算



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

 

版权声明


相关文章:

  • xmlserializer转换json2024-12-20 18:30:03
  • 使用fdisk命令后,什么命令可以查看分区信息?2024-12-20 18:30:03
  • .so文件怎么执行2024-12-20 18:30:03
  • 常用虚拟机软件有哪些?2024-12-20 18:30:03
  • 高并发会带来哪些问题2024-12-20 18:30:03
  • linux重复运行shell命令2024-12-20 18:30:03
  • 键值对是什么意思2024-12-20 18:30:03
  • jvm调优实战简书2024-12-20 18:30:03
  • dmi linux2024-12-20 18:30:03
  • 单例模式的8种写法2024-12-20 18:30:03