0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

異或運算規(guī)則及其應用詳解

姚小熊27 ? 來源:網(wǎng)絡整理 ? 2018-03-01 14:22 ? 次閱讀

異或運算簡介

異或運算一般指異或。英文為exclusiveOR,縮寫成xor。異或(xor)是一個數(shù)學運算符。它應用于邏輯運算。異或的數(shù)學符號為“⊕”,計算機符號為“xor”。其運算法則為:

a⊕b=(?a∧b)∨(a∧?b)

如果a、b兩個值不相同,則異或結(jié)果為1。如果a、b兩個值相同,異或結(jié)果為0。

異或也叫半加運算,其運算法則相當于不帶進位的二進制加法:二進制下用1表示真,0表示假,則異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進位。

異或略稱為XOR、EOR、EX-OR

程序中有三種演算子:XOR、xor、⊕。

使用方法如下

z=x⊕y

z=xxory

異或運算規(guī)則

1.a⊕a=0

2.a⊕b=b⊕a

3.a⊕b⊕c=a⊕(b⊕c)=(a⊕b)⊕c;

4.d=a⊕b⊕c可以推出a=d⊕b⊕c.

5.a⊕b⊕a=b.

6.若x是二進制數(shù)0101,y是二進制數(shù)1011;

則x⊕y=1110

只有在兩個比較的位不同時其結(jié)果是1,否則結(jié)果為0

即“兩個輸入相同時為0,不同則為1”!

異或運算規(guī)則及其應用

異或運算的作用

在計算機中普遍運用,異或(xor)的邏輯符號一般用xor,也有用⊕的:

真⊕假=真

假⊕真=真

假⊕假=假

真⊕真=假

或者為:

True⊕False=True

False⊕True=True

False⊕False=False

True⊕True=False

部分計算機語言用1表示真,用0表示假,所以兩個字節(jié)按位異或如下

異或運算規(guī)則及其應用

下面是兩個二進制數(shù)值進行異或計算:

異或運算規(guī)則及其應用

現(xiàn)實中用的都是十進制的數(shù)值,那么我們來看一看兩個十進制數(shù)值是怎么進行異或計算:

5⊕3=?

1.進行異或計算前會把數(shù)值都轉(zhuǎn)換為二進制:

5和3轉(zhuǎn)為二進制分別為:0101、0011

異或運算規(guī)則及其應用

2.再把結(jié)果0110轉(zhuǎn)換為十進制的:6

3.所以5⊕3=6

異或運算的巧用

與其它語言不同,C語言C++語言的異或不用xor,而是用“^”,鍵入方式為Shift+6。(而其它語言的“^”一般表示乘方)

若需要交換兩個變量的值,除了通常使用的借用中間變量進行交換外,還可以利用異或,僅使用兩個變量進行交換,如:

異或運算規(guī)則及其應用

這樣就完成了a與b的交換。

綜上:同一變量與另一變量和其異或值異或等于另一個數(shù),如(a^b)^a=b。

用例:可使用于加密算法某一環(huán)節(jié)或更多環(huán)節(jié),使算法更復雜,不易被破解,安全性更高。

異或運算經(jīng)典應用

參與運算的兩個值,如果兩個相應bit位相同,則結(jié)果為0,否則為1。

即:

0^0=0,

1^0=1,

0^1=1,

1^1=0

例如:10100001^00010001=10110000

按位異或的3個特點:

(1)0^0=0,0^1=10異或任何數(shù)=任何數(shù)

(2)1^0=1,1^1=01異或任何數(shù)-任何數(shù)取反

(3)任何數(shù)異或自己=把自己置0

按位異或的幾個常見用途:

(1)使某些特定的位翻轉(zhuǎn)

例如對數(shù)10100001的第2位和第3位翻轉(zhuǎn),則可以將該數(shù)與00000110進行按位異或運算。

10100001^00000110=10100111

(2)實現(xiàn)兩個值的交換,而不必使用臨時變量。

例如交換兩個整數(shù)a=10100001,b=00000110的值,可通過下列語句實現(xiàn):

a=a^b;//a=10100111

b=b^a;//b=10100001

a=a^b;//a=00000110

////////////////////////////////////////////////////////////

兩個變量交換值的方法【http://blog.sina.com.cn/s/blog_676015470100izpg.html】

第一種方法,大家會借助第三個變量來實現(xiàn):

如:C=A;A=B;B=C;

這種方法需要借助第三變量來實現(xiàn);

第二種方法是利用加減法實現(xiàn)兩個變量的交換,

如:A=A+B;B=A-B;A=A-B;

第三種方法是得用位異或運算來實現(xiàn),也是效率最高的一種,在大量數(shù)據(jù)交換的時候,效率明顯優(yōu)于前兩種方法,

如:A=A^B;B=A^B;A=A^B;

原理:利用一個數(shù)異或本身等于0和異或運算符合交換率。

PS:還有一篇更為深刻的文章對換值進行了探討,作者的研究精神值得學習:

http://rednaxelafx.javaeye.com/blog/134002

/////////////////////////////////////////////////////////////

(3)在匯編語言中經(jīng)常用于將變量置零:

xora,a

(4)快速判斷兩個值是否相等

舉例1:判斷兩個整數(shù)a,b是否相等,則可通過下列語句實現(xiàn):

return((a^b)==0)

舉例2:Linux中最初的ipv6_addr_equal()函數(shù)的實現(xiàn)如下:

staticinlineintipv6_addr_equal(conststructin6_addr*a1,conststructin6_addr*a2)

{

return(a1-》s6_addr32[0]==a2-》s6_addr32[0]&&

a1-》s6_addr32[1]==a2-》s6_addr32[1]&&

a1-》s6_addr32[2]==a2-》s6_addr32[2]&&

a1-》s6_addr32[3]==a2-》s6_addr32[3]);

}

可以利用按位異或?qū)崿F(xiàn)快速比較,最新的實現(xiàn)已經(jīng)修改為:

staticinlineintipv6_addr_equal(conststructin6_addr*a1,conststructin6_addr*a2)

{

return(((a1-》s6_addr32[0]^a2-》s6_addr32[0])|

(a1-》s6_addr32[1]^a2-》s6_addr32[1])|

(a1-》s6_addr32[2]^a2-》s6_addr32[2])|

(a1-》s6_addr32[3]^a2-》s6_addr32[3]))==0);

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 異或運算
    +關注

    關注

    0

    文章

    9

    瀏覽量

    1993
收藏 人收藏

    評論

    相關推薦

    LABVIEW中如何實現(xiàn)兩個十六進制數(shù)的按位運算

    求大神指點LABVIEW中如何實現(xiàn)兩個十六進制數(shù)的按位運算,非常感謝!
    發(fā)表于 02-13 23:00

    VHDL運算

    請問各位,在運算時,如果兩個輸入端,一個有信號,一個沒有信號,是不是就無法進行運算了?
    發(fā)表于 12-26 16:44

    C語言總結(jié)之運算的一些特性及巧妙應用

    C語言總結(jié)之運算的一些特性及巧妙應用1.一個數(shù)和自己做的結(jié)果是0。如果需要一個常數(shù)0,x86平臺的編譯器可能會生成這樣的指令:xor
    發(fā)表于 09-11 15:05

    單片機教程(13)邏輯與指令詳解

    ) 01110001(56H) 00100110結(jié)果 00100000 即20H,從上面的式子能看出,兩個參與運算的值只要其中有一個位上是0,則這位的結(jié)果就是0,兩個同是1,結(jié)果才是1。理解了邏輯與的運算規(guī)則,結(jié)果自然
    發(fā)表于 06-14 18:22

    什么是_運算運算的作用

    ,是一個數(shù)學運算符,英文為exclusive OR,縮寫為xor,應用于邏輯運算。的數(shù)學
    發(fā)表于 11-28 11:19 ?11.9w次閱讀
    什么是<b class='flag-5'>異</b><b class='flag-5'>或</b>_<b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>及<b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>的作用

    只需運算的秘密分享方案

    針對傳統(tǒng)基于插值多項式的秘密分享方案,需要復雜的多項式運算,當涉及的數(shù)據(jù)比較大時,運算效率特別低的問題,提出一種結(jié)合數(shù)據(jù)分塊方法以及僅需要在GF(2)上的
    發(fā)表于 01-07 12:05 ?0次下載
    只需<b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>的秘密分享方案

    一文看懂C語言運算

    或是一個數(shù)學運算符它應用于邏輯運算。本文開始介紹了運算的法則,其次介紹了
    發(fā)表于 03-01 11:52 ?4.6w次閱讀
    一文看懂C語言<b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>

    邏輯運算怎么算

    本文開始對邏輯運算進行了介紹,介紹了邏輯運算性質(zhì),其次分析了邏輯
    的頭像 發(fā)表于 03-01 15:11 ?10.8w次閱讀
    邏輯<b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>怎么算

    運算有什么用_二進制運算法則

    本文開始介紹了運算的邏輯表達式,其次分析了運算有什么用以及介紹了
    的頭像 發(fā)表于 03-28 16:14 ?4.8w次閱讀
    <b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>有什么用_二進制<b class='flag-5'>異</b><b class='flag-5'>或</b><b class='flag-5'>運算</b>法則

    JAVA中的交換運算規(guī)則

    Java中的位運算符中有一個叫做運算符,符號為(^)或者 Xor
    的頭像 發(fā)表于 05-05 23:21 ?2446次閱讀
    JAVA中的<b class='flag-5'>異</b><b class='flag-5'>或</b>交換<b class='flag-5'>運算</b><b class='flag-5'>規(guī)則</b>

    運算怎么算

    ,英文為exclusive OR,縮寫成xor。(eor)是一個數(shù)學運算符。它應用于邏輯運算
    的頭像 發(fā)表于 11-19 16:00 ?3.2w次閱讀

    邏輯的定義和應用 邏輯或與邏輯與的區(qū)別

    邏輯(XOR,Exclusive OR)是一種二進制運算,其結(jié)果取決于兩個輸入值是否不同。如果兩個輸入值相同,結(jié)果為0(假);如果兩個輸入值不同,結(jié)果為1(真)。邏輯或在計算機科
    的頭像 發(fā)表于 11-19 09:40 ?479次閱讀

    邏輯運算符在Python中的用法

    在Python編程語言中,邏輯運算符并不直接作為一個內(nèi)置的操作符存在,因為Python更側(cè)重于高級編程和可讀性,并沒有直接提供
    的頭像 發(fā)表于 11-19 09:46 ?186次閱讀

    如何利用邏輯提高數(shù)據(jù)處理效率

    在計算機科學和數(shù)據(jù)處理領域,邏輯(XOR)是一種基本的位運算,它在多個方面展現(xiàn)出其獨特的價值。 邏輯的原理 邏輯
    的頭像 發(fā)表于 11-19 09:54 ?202次閱讀

    邏輯的常見誤區(qū)及解決方法

    用于布爾值(真/假)之間的運算,其結(jié)果是基于輸入值的邏輯差異。 按位或則用于整數(shù)二進制數(shù)的每一位進行
    的頭像 發(fā)表于 11-19 09:56 ?283次閱讀