鱼C论坛

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

[已解决]按位异或的使用

[复制链接]
发表于 2020-3-21 18:17:52 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<iostream>
  2. void swap(int*x,int*y);
  3. main()       
  4. {
  5.         int x,y;
  6.         std::cout<<”请输入两个不同的数字:”;
  7.         std::cin>>x>>y;
  8.         swap(&x,&y);
  9.         std::cout<<”调换后输出:”<<x<<’ ’<<y<<”\n”;
  10. }
  11. void swap(int*x,int*y)
  12. {
  13.         *x^=*y;
  14.         *y^=*x;
  15.         *x^=*y
  16. }
复制代码

有没有大神能给讲讲,swap函数体里的,按位异或,实现两个数字的交换的,具体过程啊
第一次见函数体的按位异或的写法,不是很懂
最佳答案
2020-3-21 19:33:18
位异或其实遵循我们数学运算里面的结合律和交换律

举例:
1  a=a^b  
2  b=b^a
3  a=a^b
先看1
运行完,a的值=a^b
然后继续2步骤
当前的式子就变成  b=b^a^b,根据所谓的交换律,可以转成 b=(b^b)^a b^b为0,所以式子又变成  b=0^a,这个结果不就是b=a,已经实现一个交换了
接着3步骤
a=a^b,由上面的结果继续替换,a=(a^b)^a,然后你懂的,交换,a=(a^a)^b,a=0^b,所以a=b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-21 18:58:16 | 显示全部楼层
比如1和2异或 二进制下1为0000 0001  2为0000 0010   
第一次 *x = *x ^ *y    第二次*y = *x ^ *y   第三次 *x = *x ^ *y
第一次异或         第二次异或      第三次异或
    0000 0001            0000 0011         0000 0011
^  0000 0010        ^  0000 0010     ^  0000 0001
=  0000 0011        =  0000 0001    =  0000 0010
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-21 19:33:18 | 显示全部楼层    本楼为最佳答案   
位异或其实遵循我们数学运算里面的结合律和交换律

举例:
1  a=a^b  
2  b=b^a
3  a=a^b
先看1
运行完,a的值=a^b
然后继续2步骤
当前的式子就变成  b=b^a^b,根据所谓的交换律,可以转成 b=(b^b)^a b^b为0,所以式子又变成  b=0^a,这个结果不就是b=a,已经实现一个交换了
接着3步骤
a=a^b,由上面的结果继续替换,a=(a^b)^a,然后你懂的,交换,a=(a^a)^b,a=0^b,所以a=b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-22 10:20:55 | 显示全部楼层
4goodworld 发表于 2020-3-21 19:33
位异或其实遵循我们数学运算里面的结合律和交换律

举例:

我还是有个疑问想要请问您,原代码中三条按位异或运算展开后得到
① *x = *x ^ *y
② *y = *y ^ *x
③ *x = *x ^ *y
将2代入1得到 *y = *y ^ *x ^ *y,交换后得到 *y = *x
既然已经得到了 *y = *x 那为什么在计算3的时候还要代入1,而不是代入2的结果呢
麻烦您给解答下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-22 11:01:14 | 显示全部楼层
巨兔12138 发表于 2020-3-22 10:20
我还是有个疑问想要请问您,原代码中三条按位异或运算展开后得到
① *x = *x ^ *y
② *y = *y ^ *x


你要按照逻辑来,不要混
步骤一 的结果就是*x
步骤二 的结果就是*y
第三步的时候, *x=*x^*y,  *x^*y这里面 你觉得*x从哪里取?当然是步骤一的结果来取,而步骤一的*x= *x ^ *y,请注意,这里面的*y是步骤二的*y吗?显然不是的,这是最初的值哟,反倒是第三步里面的*y是步骤二里面的*y,其实就是*x,因此替换成了(*x ^ *y)^(*x)
说得有点绕,我感觉就是这么绕,你自己要拿笔再圈圈画画,再理解下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 02:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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