长发大哥 发表于 2018-10-25 00:29:10

异或运算符用法

a=a^b;
b=b^a;
a=a^b;是什么意思

零度非安全 发表于 2018-10-25 08:18:31

交换 a 和 b 的值,如果要通过一个函数来交换 a 和 b 的值,有几种方法:

1. 通过引用来修改

2. 通过指针来修改

3. 通过位运算符来修改

calton007 发表于 2018-10-25 08:58:11

本帖最后由 calton007 于 2018-10-26 15:27 编辑

^ 是异或运算符,异或也叫半加运算,其运算法则相当于不带进位的二进制加法。
在二进制下用1表示真,0表示假,则异或的运算法则为:
        0^0=0
        1^0=1
        0^1=1
        1^1=0
概括为相同为0,不同为1。

举个例子:
假设 a = 10(二进制表示为 1010), b = 12(二进制表示为 1100)
(1)a = a ^ b;
         1010
   ^    1100
----------------------
         0110
a = 0110,b = 1100

交换两个数相当于比较他们的每一个二进制位,相同的不变,不同的交换
这一步的目的就是运算得出不相同的二进制位,0表示相同,1表示不同
所以a的结果 0110 表示:a和b的中间两位不同,最低和最高位相同

(2)b = a ^ b
         0110
   ^    1100
----------------------
         1010

a = 0110,b = 1010
这一步是让b的值变成a原来的值,(1)已经算出来a和b的中间两位不同,所以这一步将b的中间两位翻转就能得到a

(3)a = a ^ b
         0110
   ^    1010
----------------------
         1100

a = 1100,b = 1010
上一步b的值变成a原来的值了,a的结果仍然是a ^ b,对于b(现在已经是原来a的值),相同的位数不变,不同的位数取反,其结果就是原来b的值。

建议还是不要用这种方法交换两个数,同样不用第三个变量,用加减法就能做到交换两个数:
a = a + b
b = a - b
a = a - b

pheron 发表于 2018-10-25 09:11:22

^按位异或,两个数对应位每一位的数值相等就赋0,不等则赋1。
楼上讲的已经很全面了

风扫地 发表于 2018-10-25 13:51:26

按位逐一操作,遇到0不变,遇到1取反。这样会好记一点。
页: [1]
查看完整版本: 异或运算符用法