黑马程序员技术交流社区

标题: 关于交换两个数 [打印本页]

作者: jk474443390    时间: 2016-11-28 19:15
标题: 关于交换两个数
void swap(int &a, int &b)
{
    a=a^b;
    b=a^b;
    a=a^b;   //a=a(a)^b; ,既然a只是表示a,那么为什么a会等于a^b呢?

}
提问:
既然a只是表示a,那么为什么a会等于a^b呢?本人实在是想不通,求大神。。。
作者: jk474443390    时间: 2016-11-28 19:23
求大神指导
作者: aA772807986    时间: 2016-11-28 19:32
那不叫等于,是叫赋值,将a^b赋予a
作者: jk474443390    时间: 2016-11-28 19:40
aA772807986 发表于 2016-11-28 19:32
那不叫等于,是叫赋值,将a^b赋予a

恩我说错了,对不起,大神,我的意思是到了第三部,a=a^b; 右边的a是简简单单的a,还是上面的a^b?
作者: jk474443390    时间: 2016-11-28 19:41
aA772807986 发表于 2016-11-28 19:32
那不叫等于,是叫赋值,将a^b赋予a

恩我说错了,对不起,大神,我的意思是到了第三部,a=a^b; 右边的a是简简单单的a,还是上面的a^b?
作者: aA772807986    时间: 2016-11-28 19:46
jk474443390 发表于 2016-11-28 19:40
恩我说错了,对不起,大神,我的意思是到了第三部,a=a^b; 右边的a是简简单单的a,还是上面的a^b? ...

此时的a是a^b
作者: jk474443390    时间: 2016-11-28 19:50
aA772807986 发表于 2016-11-28 19:46
此时的a是a^b

太感谢大神了,感谢感谢!
作者: ly610    时间: 2016-11-28 20:03
^是位运算符,代表异或的关系(在同一位上相同为0,不同为1)
上边的这个方法是实现的功能是交换
比如a的值为3,b的值为1
对应的二进制值a=11,b=01
第一步a=10,b=01,
第二步a=10,b=11,
第三步a=01,b=11,
从而实现了两个数的交换
作者: 苏大叔丶    时间: 2016-11-28 20:33

你可以这看
a = a ^ b
b = a ^ b      其实就是b =a ^b ^b  (一个数被异或两次就是其本身,所以这里等于a被b异或了两次,所以这还是a,被赋值给了b)
a = a ^ b     所以这里就是 a = a ^ a ^ b   b被异或了两次  所以还是b  被赋值给了a  

差不多就是这样






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2