按位异或的使用
#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函数体里的,按位异或,实现两个数字的交换的,具体过程啊
第一次见函数体的按位异或的写法,不是很懂 比如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 位异或其实遵循我们数学运算里面的结合律和交换律
举例:
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 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的结果呢
麻烦您给解答下吧 巨兔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]