巨兔12138 发表于 2020-3-21 18:17:52

按位异或的使用

#include<iostream>
void swap(int*x,int*y);
main()       
{
        int x,y;
        std::cout<<”请输入两个不同的数字:”;
        std::cin>>x>>y;
        swap(&x,&y);
        std::cout<<”调换后输出:”<<x<<’ ’<<y<<”\n”;
}
void swap(int*x,int*y)
{
        *x^=*y;
        *y^=*x;
        *x^=*y
}

有没有大神能给讲讲,swap函数体里的,按位异或,实现两个数字的交换的,具体过程啊
第一次见函数体的按位异或的写法,不是很懂

wangyaoheng 发表于 2020-3-21 18:58:16

比如1和2异或 二进制下1为0000 00012为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

4goodworld 发表于 2020-3-21 19:33:18

位异或其实遵循我们数学运算里面的结合律和交换律

举例:
1a=a^b
2b=b^a
3a=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

巨兔12138 发表于 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的结果呢
麻烦您给解答下吧

4goodworld 发表于 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)
说得有点绕,我感觉就是这么绕,你自己要拿笔再圈圈画画,再理解下
页: [1]
查看完整版本: 按位异或的使用