免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16476 | 回复: 16
打印 上一主题 下一主题

用异或实现两个数的交换的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-20 21:56 |只看该作者 |倒序浏览
void swap(int &a,int &b)
{
a^=b;
b^=a;
a^=b;
}
调试通过确实能够实现两个数的交换,用具体的事例计算确实可以,但是就是不知道其原理哈??
希望那位高人给予指点!!

论坛徽章:
0
2 [报告]
发表于 2006-06-21 00:08 |只看该作者
a-------------------------b
a^=b    a^b----------------------b
b^=a    a^b---------b^(a^b) => a
a^=b    a^b^(a) => b----------a

OK        b--------------------------a

论坛徽章:
0
3 [报告]
发表于 2006-06-21 00:21 |只看该作者
原帖由 mingyanguo 于 2006-6-21 00:08 发表
a-------------------------b
a^=b    a^b----------------------b
b^=a    a^b---------b^(a^b) => a
a^=b    a^b^(a) => b----------a

OK        b--------------------------a


兄弟真有耐心,手把手地教代数。

论坛徽章:
0
4 [报告]
发表于 2006-06-21 02:59 |只看该作者
原帖由 雨丝风片 于 2006-6-21 00:21 发表


兄弟真有耐心,手把手地教代数。

C版没几个我能看懂的帖子了,好不容易能回一个啊.

论坛徽章:
0
5 [报告]
发表于 2006-06-21 08:31 |只看该作者
原帖由 mingyanguo 于 2006-6-21 02:59 发表

C版没几个我能看懂的帖子了,好不容易能回一个啊.


用你的话说,叫“现在牛人太多了”?

论坛徽章:
0
6 [报告]
发表于 2006-06-21 09:52 |只看该作者
a^=b    a^b----------------------b

论坛徽章:
0
7 [报告]
发表于 2006-06-21 12:03 |只看该作者
RAID里面就用到了这技术。三个里面知道任意两个就可以恢复第三个

论坛徽章:
0
8 [报告]
发表于 2006-06-21 12:34 |只看该作者

回复 1楼 xiaopeiwu 的帖子

还不是很明白??

论坛徽章:
0
9 [报告]
发表于 2006-06-21 13:45 |只看该作者
我记得数字电路里讲过逻辑运算法则。

^ 在 C 里面是按位异或操作符。异或运算的原理应该清楚吧?相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

  1. a = 0101   (5 的二进制表示)
  2. b = 1100   (12 的二进制表示)
  3.     ----
  4. c = 1001   (结果为 9)
复制代码

可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。

然后有两个定理:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:


  1. a = 0101
  2. c = 1001
  3.     ----
  4. b = 1100
复制代码


同样, b 与 c 异或结果就变成了 a:

  1. b = 1100
  2. c = 1001
  3.     ----
  4. a = 0101
复制代码

论坛徽章:
0
10 [报告]
发表于 2006-06-21 14:26 |只看该作者
呵呵,看来要回顾一下了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP