异或(^)运算的应用
异或运算的性质:
a^a==0
a^0==a
即任何一个数与自身异或为0,与零异或为自身。
1,置零
利用这个性质,可以用于2个数的交换,置零等。
比如,我们在汇编语言里,经常看到这样的汇编语句:
xor eax,eax
这条汇编语句,利用异或性质,将eax置零。
2,交换2个数
异或另一个出名的应用是两个数的交换:
#define SWAP(a,b) \
do{\
a=a^b;\
b=a^b;\
a=a^b;\
}while(0)
证明:
假设:a和b的初始值:a=a0,b=b0;
那么:
第一句:a=a^b即a为a0^b0
第二句:b=a^b即(a0^b0)^b
第三句:a=a^b即a0^b0^a
因此,通过上面的推导,实现了a与b值的交换。
3,单指针域构造双向链表
此外,异或还可以用在链表中,我们知道,通常的双向链表,需要在链表结点中设置2个指针,指向该结点的前驱和后继结点,但如果使用异或,则可以用单个指针域来表示双向链表:
有任意3个相邻结点:PL, P, PR
那么P->next = PL^PR
对于头结点来说:P没有左边的结点,所以左结点为NULL
所以Head->next = NULL^PR
对于尾结点来说:
尾结点没有右边的结点,所以PR为NULL
Tail->next = PL^NULL
那么在遍历的时候:
按照上述规则生成链表之后,遍历方法如下:
从左往右遍历链表:
pl=NULL;
p=Head;
while(p!=Tail)
{
pr=pl^(p->next);
pl=p;
p=pr;
}
从右往左遍历链表:
pr=NULL;
p=Tail;
while(p!=Head)
{
pl=pr^(p->next);
pr=p;
p=pl;
}