C/C++使用异或交换元素及固有的缺点

1 如何使用异或来交换元素

代码如下

/** \brief      swap  异或交换两元素
 *  \author     xxx
 *  \copyright  GNU Public License
 *  \version    1.0 
 *  \date       2020-1-4
 *  \bug		不能指向同一个内存地址
 * 
 *  \param[in] a 输入a
 *  \param[in] b 输入a
 *  \return      void
 */ 
void swap(int *a, int *b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

下面来解释这段代码,首先基于两个异或的知识点
1. 自己和自己异或等于0,即a^a=0
2. 0和任何数异或等于它自己,即0^a=a

接着下面的代码就很好理解了

 a^b^b =a^0=a					// 第一句代码^第二句代码
 a^a^b =0^b=b					// 第三句代码

看着有点傻,这肯定啊。上面的三句代码的原理就是这儿,仔细想想就知道了

注意:该函数有一个缺点,a和b不能指向同一个内存单元,这样就变成0了哈,如果实际情况存在这种情况就不能用哈,这种方式确实节约了一个临时变量的存储空间。

2 扩展,一组数,只有一个数出现一次,其他数出现两次,求出现一次的这个数?

答案:一直异或下去,结果就是答案哈

3 一组数,只有一个数出现一次,其他数出现三次,求出现一次的这个数?

哈哈,这个自己想…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值