认清C/C++编程之-----异或运算

使用异或进行数据交换,很早以前有的程序员使用下面的方法进行两个数据之间的交换

      a^=b;
b^=a;
a^=b;
即a^=b^=a^=b;
只有在两个比较的位不同时其结果为1,否则为0即[两个输入相同时为0,不同时为1]
    (异或原则:0 1 0 1 
                         1 0 0 1
       结        果:1 1 0 0
曾在网上看到有的朋友说a与b的值如果一样,即a=b时,这个算法不成立值会被清零,我们详细的分析一下数据交换的过程,我们以二进制来表示:如a=b=0101
a^=b;   //a=a^b=0101^0101   结果a=0000
b^=a;   //b=b^a=0101^0000   结果b=0101
a^=b;   //a=a^b=0000^0101   结果a=0101
所以我们使用异或进行数据交换是完全成立的。
同时,我们以后也可以使用a^=a;进行清零操作。并且剧说效率更高,我们也可以进行这样的使用如:if(a^b==0) if(a-b==0)的判断效率更高
那么当我们如下使用异或运算时为什么会出错呢? 
void exchange(int &a,int &b)
{a^=b^=a^=b;                           //错误的作法;
}
这种做法看上去不错,但我们不可能正确使用它.因为编译法则不允许同一个表达式两次修改一个变量的值;
这会引起不确定状态的结果.

      void  exchange(int &a,int &b)  //正确的作法,不要写在同一个表达式
{  a^=b;
   b^=a;
  a^=b;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序人生起波澜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值