首页 > C > 位运算 阅读:57,774

异或(^)运算的应用

< 上一页 异或(^)运算 左移(<<)运算 下一页 >

异或运算的性质:

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)

证明:

假设:ab的初始值:a=a0,b=b0;

那么:

第一句:a=a^baa0^b0

第二句:b=a^b(a0^b0)^b0=》a0^(b0^b0)=》a0^0=》a0

第三句:a=a^ba0^b0^a0=》a0^a0^b0=》0^b0=》b0

因此,通过上面的推导,实现了ab值的交换。

 

3,单指针域构造双向链表

此外,异或还可以用在链表中,我们知道,通常的双向链表,需要在链表结点中设置2个指针,指向该结点的前驱和后继结点,但如果使用异或,则可以用单个指针域来表示双向链表:

有任意3个相邻结点:PL P PR
那么P->next = PL^PR
对于头结点来说:P没有左边的结点,所以左结点为NULL
所以Head->next = NULL^PR

对于尾结点来说:
尾结点没有右边的结点,所以PRNULL
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;

}

< 上一页 异或(^)运算 左移(<<)运算 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注