鱼C论坛

 找回密码
 立即注册
查看: 1501|回复: 4

[已解决]异或运算符用法

[复制链接]
发表于 2018-10-25 00:29:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
a=a^b;
b=b^a;
a=a^b;是什么意思
最佳答案
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;
         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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-25 08:18:31 | 显示全部楼层
交换 a 和 b 的值,如果要通过一个函数来交换 a 和 b 的值,有几种方法:

1. 通过引用来修改

2. 通过指针来修改

3. 通过位运算符来修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
         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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-10-25 09:11:22 | 显示全部楼层
^按位异或,两个数对应位每一位的数值相等就赋0,不等则赋1。
楼上讲的已经很全面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 13:51:26 | 显示全部楼层
按位逐一操作,遇到0不变,遇到1取反。这样会好记一点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 18:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表