按位异或 ( ^ ) , 可以在不额外创建变量的情况下,对两个整形变量的数值进行交换。
原理
在二进制中,对应的对应二进制位相同时异或为零,相异时异或为一。
运算过程如下图,
应用 (一):整形数值交换
我们可以利用异或 ( ^ ) 对两个整形变量进行数值交换。
具体实现过程如下:
#include <stdio.h> int main(void) { int a = 10; int b = 13; b = a^b; a = b^a; b = b^a; printf("%d %d",a,b); }
对这段代码进行运行,输出的结果为:
应用(二):寻找消失的数字
如果光靠这一个交换整形变量的应用的话,不好理解其妙处所在。那么这个应用二,则可以帮助更好地理解异或 ( ^ ) 运算符的妙用所在。
题目:现有数组nums,它存储了从0到n的整数(不重复),但是nums丢失了一位整数,如何利用异或 ( ^ ) 运算符来需找出它?
int missingNumber(int* nums, int size)
{
int ret = 0;
for (int i = 0; i < size; i ++) //对nums内每个元素进行异或存储
{
ret ^= nums[i];
}
for (int i = 0; i <= size; i++) //查找出丢失的数
{
ret ^= i;
}
return ret; //此时变量ret的值为消失的那个数
}
如果光看代码,不好看懂其妙用。
我的理解是,异或 ( ^ ) 就是一张信用卡
我定义个整形变量 ret,假设变量n = 10 我将0 ~ n内的所有数都异或一遍,就是ret = ^= nums[i],此时变量ret内记录了 0 ~10 内的所有数
完事后,我还钱,将ret 与 0 ~ 10 都与 变量ret 异或 ( ^ ) 一遍来抵消,得出来最后的值为0,
那么,我只抵消0 ~ 9 呢?不抵消10,那么异或 ( ^ ) 后得出来的结果是10。
为了更好的理解,建议动手在草稿纸上算一遍,n可以取值为3、4,减少计算量 。