位“异或”运算在变量交换中的应用
变量交换的算法一般有三种:
1.使用临时变量
void swap(int* a,int* b)
{
int temp=*a;
*a=*b;
*b=temp;
}
这种方法比较常见,就不多解释了。
2.利用加减法运算
void swap(int* a,int* b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
这种方法使用了a+(-a)=0的原理,现在我们来拆解一下运算步骤:
设*a=x,*b=y
*a | *b | |
Step 1 | x+y | y |
Step 2 | x+y | x+y+(-y),即x |
Step 3 | x+y+(-x),即y | x |
类似地,可以得到如下算法
void swap(int* a,int* b)
{
*a=*a-*b;
*b=*a+*b;
*a=*b-*a;
}
这种算法的好处是,不使用临时变量,节省空间。但是,存在着数据溢出的风险。
3.利用异或运算
这种方法类似第二种方法,利用的正是a^a=0性质。代码如下:
void swap(int* a,int* b)
{
*a=*a^*b;
*b=*a^*b;
*b=*a^*b;
}
同样地,运算步骤如下:
设*a=x,*b=y
*a | *b | |
Step 1 | x^y | y |
Step 2 | x^y | x^y^y,即x |
Step 3 | x^y^x,即y | x |
这种方法的好处是:1.不使用临时变量,节省空间;2.不存在数据溢出的风险。
“异或”与“或”之间的关系
“异或”是特殊的“或”运算,在“或”的基础上增加了同为“1”时,异或为“0”。那么如何用或来表达异或呢?其实很简单,当自己为“1”时相互置对方为“0”就可以了,他们之间的关系可以用如下关系式表达:
a^b=(a&~b)|(~a&b)
(a&~b):用来将a中与b中值为“1”的对应的位置为“0”
(~a&b):将b中与a中值为“1”的对应的位置为“0”