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 一组数,只有一个数出现一次,其他数出现三次,求出现一次的这个数?
哈哈,这个自己想…