如何理解「異或」的含義?

Exclusive or英文名怎麼理解呢?異或最早是因為什麼發明的?
對於a⊕b⊕a=b,我覺得「0異或任何數不變,1異或任何數取反」比較好理解,有沒有別的理解方式,感覺好神奇。能獨立發現a⊕b⊕a=b交換a,b值的人,能不能告訴我你們是怎麼思考的。。。


異或是mathbb{Z}_2群的加法運算,滿足加法結合律和交換律


嗷,謝謝題主的問題。

我剛剛查了wiki上異或的詞條,來回答一下這個問題:exclusive有一個意思是『排外的』。如果我們說A和B是『mutually exclusive』,那就是說A和B互不相容,互相排斥。

回想一下『或』這個詞在數學裡的意思——『一個元素在集合A或集合B里』往往意味著『它只在A里』、『它只在B里』、『它在A和B的交集里』這三種情況中的一種。

『或』的維恩圖如下:

『異或』則不同,不允許『共存』的情況,因為是exclusive的,所以維恩圖如下:

好。那三個圈的維恩圖是什麼樣的呢?

在兩個圈的基礎上加上一個圈:

異或一下,得到:

發現了嗎!在維恩圖中,當我們用一個新的圈來異或已有的圈,我們相當於是在做『反色』操作。

所以,異或操作是交換且結合的,因為誰管你哪個圈圈在上、哪個圈圈在下呢!

再看看題主說的『a⊕b⊕a=b』這個式子,是不是就很顯然了?

那麼就這樣=w=

參考資料:Exclusive or(如果想更具體地了解,可以看鏈接里的小標題:Exclusive "or" in English)


男性和女性能生出孩子,否則就不行。


我回答下這個

能獨立發現a⊕b⊕a=b交換a,b值的人,能不能告訴我你們是怎麼思考的。。。

因為我獨立發現過。。。。

這樣,我們用加法類比。。。。

假設有兩個數A=a和B=b,我們要不依靠第三個變數交換它們。
首先把B加到A上。

A=A+B=a+b

然後A現在就是a和b的和。B仍然是b。
所以我們現在要讓B變為a就是

B=A-B=a+b-b=a

然後我們讓A變成b

A=A-B=a+b-a=b

這樣就完成了。

這就是原理。


但是用在程序里會有一個問題——溢出。
我們都知道32位無符號數最大能表示約42億的數。
那麼假如我A裡面存著一個40億的數,B裡面存著一個30億的數。求和,就超過了32位能表示的上限。

但是我們再想,計算機數都是二進位。
那麼我們用二進位的性質。
下面舉例子:(數字後的b表示這是個二進位數)

A=1101b
B=1011b

然後我們按照下面的規則分別對每一位做加法:
1+0=1 0+1=1 0+0=0
如果有進位,我們就不要了:
1+1=0
我們把這個運算用「^」符號表示。

和上面步驟一樣:先求「和」

A=A^B=1101b^1011b=0110b

然後我們要算上面的「和」 「減」 B的值來得到原來a的值。
減是上面的「^」的逆運算,那麼就是:
1-0=1 1-1=0 0-0=0
同時我們規定,減法的借位也不需要:
0-1=1

然後你會發現,這個運算和上面的「加」是一樣的。
所以我們也用「^」表示。

然後我們繼續來算:

B=A^B=0110b^1011b=1101b
A=A^B=0110b^1101b=1011b

和上面的利用加法的交換原理是一樣的。

我們現在再來看我們剛才定義的「^」運算:

0^0=0
0^1=1
1^0=1
1^1=0

這不就是異或嘛。


我一開始也是不理解,我看的那個課程讓我們暫停自己思考一下。。。。。。(′Д?ヽ我這智商哪裡想的出來啊
然後他說,窮舉證明(;一_一)


今天看到一個演算法實現的時候,看到裡面用異或運算做了個奇怪的動作,也開始重新思考異或的意義,思考得到如下的結果,個人認為暫時比較滿意:

通過異或本身的定義,可以發現兩個數異或有兩種性質:
1、找出兩個數有差異的位,a^b得到的結果中,1表示在該位兩數存在差別,0表示無差別,這個很好理解
2、將一個數按照另一個數的對應位的取值改變取值,如a^b(10001010^00110011),可以看成a按照b的要求改變對應位的取值(1為改變,0為不改變)故得到10111001
要清楚性質1和性質2是沒有衝突的,怎麼對異或運算進行解釋取決於哪種方便自己對運算進行處理。

再來看a^b^a=b,a^b得到a和b有差別的位,在用這個結果異或a,相當於將a中把有差別的位都改變取值,改了自然就沒有差別了,就成了b。所以兩數交換的解釋應該可以同理。


可以理解為:「不是這個就是那個」。即滿足兩個條件之一,不能兩個都選,也不能一個不選。

比如:「我明天要麼去北京,要麼去上海」 這個命題就可以理解為 「我明天去北京」 異或 「我明天去上海」 。這樣,我明天肯定在北京或上海兩地之一,不可能在第三個地方,也不可能明天同時出現在北京和上海。


最方便的理解:在模2剩餘系中進行加法運算。


異或就是不一樣就是真。同或:就是相同就是真。


這樣理解:b⊕a⊕a==b 即一個數異或另一個數兩次,其值保持不變.


╭(°A°`)╮
天哪,你們都在說啥?哪有那麼高端?異或是那個「兩位一樣的就取0,兩位不一樣就的取1」的運算來著吧?你們說的異或是xor吧?我沒記錯吧……?於是兩個a一個b異或,兩個a就消了,剩個b,所以呢?


這個答案很啰嗦,但小學生應該也能看懂……

若 m, n 是兩個整數,^ 表示異或運算,求證

a: m^n^n == m

b: m^n^m == n

異或顯然滿足交換律,b 可表示為 n^m^m == n,與 a 等價

問題是異或是否滿足結合率?下式是否成立?

m^n^n == m^(n^n) == m^0 == m (一個數異或自身顯然等於 0)

由於異或運算每一位都與其他位不相關,所以只需要證明 1 位的異或運算具有結合率即可,而 1 位的異或運算規則如下:

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

這不就是2進位的加法運算嗎!(把^全換成+,只看個位,在二進位成立)

而且我們只需要考慮 1 位的運算!

先來考慮:二進位的加法是否和我們常用的加法一樣同時滿足交換律和結合率?

這是顯然的,因為任何一個十進位整數都能且只能表示成一個二進位整數,也就是我們常說的一一對應的關係。

由於異或運算不用考慮其它位的情況,而二進位里不用考慮其它位的就只有個位了。(其它位要考慮進位)

所以問題就變成了: 個位的二進位加法滿足結合率嗎?

我們前面已經證明了二進位的加法滿足結合率,那麼這裡只要用反證法就行了:

假設個位的二進位加法不滿足結合率,那麼可以推出二進位的加法不滿足結合律,得出矛盾,假設不成立;所以個位的二進位的加法必須滿足結合率,從而得出異或運算也滿足結合率。


異或也叫半加運算,其運演算法則相當於不帶進位的二進位加法。


一個事物有兩種狀態:正面(正態)和反面(反態)

正面的反態(反面)就是反面

反面的反態(反面)就是正面

正面的正態(正面)就是正面

假設萬物都有初始狀態和一次變化得來

剛好,我們根據一個事物的最終狀態和他經過的一次正反變化,可以得知它的最初狀態

同理,我們也可以根據事物的最終狀態和它的最初狀態來得知它的一次變化過程

我們要理解一件事物為什麼這麼設計,應該從已經熟悉的領域去理解,凡是後來人工設計而出現的事物的,必定是抽象與實際得來,要用於實際的

最常見的就是:

正數乘以負數是一個負數,負數乘以一個負數是正數,正數乘以正數是一個正數

還有小學就學過的:否定的否定是肯定,肯定的否定是否定……

所以我們用0來表示事物的初態,1表示反面,計算機中有符號的也確實是這樣的吧!

這麼說,這是一個哲學問題哦,並不是像我們僅僅知道他的運算規則那麼簡單。


異或很好理解,不用記那些公式,只需要記住一句話,異或是半加器。

什麼意思,就是不帶進位的加法運算。

我們用二進位算一下。

0 xor 0 = 0

0 xor 1 = 1

1 xor 0 = 1

1 xor 1 = 0

把異或符號換成加法

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = (1)0 不要算進位

所以只需要記住異或就是半加器。

==========================================


異或實際上就是判斷兩個輸入邏輯值是否不同,如果不同則結果為1,相同則為0。

若a=0,b=0,a異或b 兩數相同,輸出結果為0,結果與b相同;

若a=0,b=1,a異或b 兩數不同,輸出結果為1,結果與b相同;

若a=1,b=0,a異或b 兩數不同,輸出結果為1,結果與b相反;

若a=1,b=1,a異或b 兩數相同,輸出結果為0,結果與b相反;


計算兩個布爾量是否相異的運算。


看了幾個回答,有幾個挺有意思,但是覺得繞太多了,思路簡單化會有助於靈活應用。我個人理解,這個只是對稱還原的一種表示形式。如果我們人為的約定某種對應方案,那麼位變化了我們也可以還原出來。異或中,約定 1 ^ 1 = 0 , 1 ^ 0 = 1, 0 ^ 0 = 0。 那麼對於 1101 這樣的數 是否能通過這個約定還原出一個確切的數呢?答案是不行的,一個數異或不了, 因為1101 可能是對應 任意兩個數的異或的結果。 異或像是一種映射表 ,通過映射表 映射到另外一種表現形式,然後通過這個映射表又可以還原到原來的數。

假設 映射表 : X
約定 : 1 - &> 5 , 2 - &> 6 , 3 -&> 7

那麼就有 (映射操作): 123 -&> X = 567
如果想要還原(還原操作) : 567 -&> X = 123
異或也是一樣,異或也是一種約定,它約定了 1 ^ 1 = 0 , 1 ^ 0 = 1, 0 ^ 0 = 0 。

所以有 操作數 A 和 操作 數 B 通過異或 得到C ,
A ^ B = C (A 對應 123 , B 代表了映射 X) 或 (B 對應 123 , A 代表了映射 X)
C ^ B = A (C 對應567 , B 代表了映射 X) 或 (B 對應567 , C 代表了映射 X)

A ^ B = C
C ^ A = B

其實對於這個異或 ,其實是一種對稱還原, 異或結果和兩個操作數有直接關係,需要按照異或
規則 ,然後按位 「映射」 就可以發現一些易於理解的思路。
案例 :
數值 A , B

A ^ B 得到一個C , 這個C 可以通過A , B任意一個數還原出另一個數,但是先把C存起來。

1. A = A ^ B ; // A 存儲了 C , 但是 B 還在,所以可以馬上還原出A,並賦值給B
2. B = A ^ B ; // 此時A為"映射值C",通過原來的B , 還原出原來的A ,賦值給B ,
3. A = A ^ B ; // B 已經是原來A的值 , 此時A依然為"映射值C" ,通過現在的B 值還原出A值。

如果還是不理解的話,就直接把異或想像成,加法運算就好 : A + B = C ,A 可以由 C - B 獲得, B 可以由 C - A 獲得,按照這種思路來進行異或流程即可。


模2加法或模2減法。


推薦閱讀:

多線程有什麼用?
為什麼一些人在使用電腦時不用殺毒軟體?
目前機器學習的瓶頸有哪些?
即時戰略遊戲(比如 WAR3)的 AI 是怎樣實現的?
如何正確的學習Coursera上Andrew Ng的機器學習課程?

TAG:數學 | 計算機 | 代數 | 計算機科學 |