本帖最后由 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;
1 0 1 0
^ 1 1 0 0
----------------------
0 1 1 0
a = 0110,b = 1100
交换两个数相当于比较他们的每一个二进制位,相同的不变,不同的交换
这一步的目的就是运算得出不相同的二进制位,0表示相同,1表示不同
所以a的结果 0110 表示:a和b的中间两位不同,最低和最高位相同
(2)b = a ^ b
0 1 1 0
^ 1 1 0 0
----------------------
1 0 1 0
a = 0110,b = 1010
这一步是让b的值变成a原来的值,(1)已经算出来a和b的中间两位不同,所以这一步将b的中间两位翻转就能得到a
(3)a = a ^ b
0 1 1 0
^ 1 0 1 0
----------------------
1 1 0 0
a = 1100,b = 1010
上一步b的值变成a原来的值了,a的结果仍然是a ^ b,对于b(现在已经是原来a的值),相同的位数不变,不同的位数取反,其结果就是原来b的值。
建议还是不要用这种方法交换两个数,同样不用第三个变量,用加减法就能做到交换两个数:
a = a + b
b = a - b
a = a - b