异或运算的一些知识

来源:互联网 发布:vscode代码提示快捷键 编辑:程序博客网 时间:2024/05/21 11:21

原文地址:http://blog.csdn.net/zzxyyx_1/article/details/19009705

用异或交换两个数就不说了,一般没人那么用,毕竟异或符号优先级低,容易产生错误。


简单的定理

若a=b^c

那么b=a^c , c=a^b

-------------------------------------------------------------------------------------------

2*k xor 2*k+1 = 1 

考虑n个连续数字异或

a xor a+1 xor a+2....xor a+n-1

可以取相邻的两个数凑成2*k xor 2*k+1

特殊处理一下两端的值即可。

考虑

a xor a+2 xor a+4... xor a+2*(n-1)

易知最后一位是不变的 其它位按上述方法处理即可。

-------------------------------------------------------------------------------------------

整数集对于异或运算构成一个群

满足封闭性、结合律、单位元和逆元。

那么有些加法的性质可以引申到异或运算中

比如 xorsum[l,r]=xorsum[0,r]^xorsum[0,l-1]

证明就是考虑数字的每一位。

若a[l,r]中某一位的1的个数为奇数,那么xorsum[l,r]那一位为1,

此时若a[0,l-1]那一位1的个数为奇,那么a[0,r]那一位1的个数为偶,xorsum[0,r]^xorsum[0,l-1]在那一位为1;

此时若a[0,l-1]那一位1的个数为偶,那么a[0,r]那一位1的个数为奇,xorsum[0,r]^xorsum[0,l-1]在那一位为1;

同理可证a[l,r]中某一位1的个数为偶数的情况。

-------------------------------------------------------------------------------------------

另外一个就是若a^b^c==0 那么对于任意0<k<=min(a,b,c)     (a-k)^(b-k)^(c-k)!=0

证明就是考虑k的某一位

首先a、b、c在该位为1的个数应为偶数,不然a^b^c!=0

若k在该位是1,那么a-k b-k c-k 会使得0变1 1变0 那么此时(a-k)^(b-k)^(c-k)在该位为1 不为0

若k在该位为0,那么无视,继续看k-1位,

由此可知若k>0 那么必有k在某位为1,此时(a-k)^(b-k)^(c-k)!=0

-------------------------------------------------------------------------------------------


0 0
原创粉丝点击