1 异或的定义
- 异或(xor)是一个数学运算符。
- 它应用于逻辑运算。
- 异或的数学符号为“⊕”,计算机符号为“xor”,也可以写成 ^ (注意区别于乘方符号^)
- 其运算法则为:
- 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
- 异或是基于二进制的
- 异或是基于二进制的,逐位的比较!
- 异或可以理解为不进位的二进制加法
2 为什么 0异或任何数=自身, 而1异或任何数=非自身
0异或任何数=自身, 1异或任何数=非自身
下面是我的推导过程,网上的往往说的不太清楚
A只可能是0 或者1
A ^ 1 的推导
如果A=0, 那么A^1=1, 所以A^1的结果和A相反
如果A=1,那么A^1=0, 所以A^1的结果和A相反
所以无论A=0/1, A^1都是非A
所以A ^1=非A
A ^0的推导
如果
如果A=0, 那么 A^0=0 , 所以A^0的结果和A相同
如果A=1, 那么 A^0=1 , 所以A^0的结果和A相同
所以A ^0=A
3 为什么有了不等于,还要异或?这两者相同吗?
- 异或 不同于 不等于
- 区别在于异或是接位进行的,不等是按整体进行的
- 异或属于位运算,把一个数以二进制的形式对每一位进行异或运算
4 xor 不同于 or
- or(t,t) =1
- xor(t,t) =0
参考资料,需要整理,先这样
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或略称为XOR、EX-OR
程序中有两种演算子:XOR、⊕。
使用方法如下
z = x ⊕ y
z = x xor y
英文术语 exclusive or 怎么理解呢?“异或”最早是因为什么发明的?
对于a⊕b⊕a=b,我觉得“0异或任何数不变,1异或任何数取反”比较好理解。有没有别的理解方式,感觉好神奇。能独立发现a⊕b⊕a=b交换 a、b 值的人,能不能告诉我你们是怎么思考的。。
表示为:
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1
1 ^ 1 = 0
特点:
0异或任何数,是任何数;
1异或任何数,任何数取反;
任何一个数字异或自己都等于0
面试题:一个整型数组中除了两个数字之外,其他的数字都出现了两次。试找出这两个只出现一次的数字。《剑指offer》
异或的意思是 按位比较,位相同(0,0或1,1)时,结果为0,位不同时(0,1或1,0)结果为1
所以,0异或任何数A 结果还是A
A异或1时,A的最后一位是1,则会变为0,如果是0,则会变为1,因此,结果一定是非A
异或本质就是无进位相加,比如下表
第一个数 | 1 | 1 | 0 | 0 |
---|---|---|---|---|
第二个数 | 0 | 1 | 0 | 1 |
结果 | 1 | 0 | 0 | 1 |
- 第一个数为1,第二数为0时,结果为1+0=1;
- 第一个数为1,第二数为1时,结果为1+1=2,逢2不进1直接为0;
- 第一个数为0,第二数为0时,结果为0+0=0;
- 第一个数为0,第二数为1时,结果为0+1=1;
结论:多个数的异或就看1的个数是奇数还是偶数,如果为奇数则最终结果为1,如果为偶数则最终结果为0
异或性质:满足交换律和结合律 即:a^b=b^a (a^b)^c=a^(b^c)
异或应用
案例1:不使用中间变量来交换两个数的位置
int a=100,b=200;
a=a^b;
b=a^b;
a=a^b;
这段代码怎么理解呢? 把a看作甲,把b看作乙
- 第一行的a=a^b;该行代码执行完之后,a变成甲^乙 , b还是乙。
- 第二行代码b=a^b;该行代码执行完之后,b=甲^乙^乙,因为乙^乙的结果为0,所以b=甲=a。
- 第三行代码a=a^b;该行代码执行完之后,a=甲^乙^甲,因为甲^甲的结果为0,所以a=乙=b。