异或相关知识 xor (草稿)

1 为什么 0异或任何数=自身, 1异或任何数=非

下面是我的推导过程,网上的往往说的不太清楚

A ^ 1 

如果A=0 ,A^1=1  A^1的结果和A相反

如果A=1  A^1=0  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

2  为什么有了不等于,还要异或?

  • 异或  不同于 不等于
  • 区别在于异或是接位进行的,不等是按整体进行的
  • 异或属于位运算,把一个数以二进制的形式对每一位进行异或运算

参考资料,需要整理,先这样

异或(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。

你可能感兴趣的:(学习)