xor運(yùn)算法則
- xor在對(duì)兩個(gè)bit運(yùn)算的時(shí)候,兩個(gè)bit值相同的時(shí)候,結(jié)果是0,不同的時(shí)候結(jié)果是1
- 操作的對(duì)象是2個(gè)操作數(shù)對(duì)應(yīng)的bit位
xor的用途
xor最常用的是將某個(gè)數(shù)清零(對(duì)自身做異或)
movw num, %ax
xorw %ax, num1 #num1為16位的 0x12
如果將一個(gè)數(shù)a和另一個(gè)數(shù)b做xor 得到結(jié)果c, 再 c xor b 就可以得到a
int a = 10;
int b = 11;
a == (a xor b xor b) //true
如何證明這個(gè)結(jié)論呢?
- 觀察xor的運(yùn)算, 我們可以得出一個(gè)結(jié)論,
其實(shí)xor相當(dāng)于不進(jìn)位的加法
。
舉個(gè)例子:
num1: .byte 0b0
num2: .byte 0b1
情況1
xorb 0, num1 #結(jié)果 num1 = 0b0 相當(dāng)于 0 + 0 = 0
xorb 1,num1 #結(jié)果 num1 = 0b1 相當(dāng)于 1 + 0 = 1
情況2
xorb 0, num2 #結(jié)果 num2 = 0b1 相當(dāng)于 0 + 1 = 1
xorb 1,num2 #結(jié)果 num2 = 0b0 相當(dāng)于 1 + 1 = 0b10, 進(jìn)位被直接舍棄, 最后num2 = 0b0
所以上述 a xor b xor b == a, 可以先理解成 a + b + b == a 這個(gè)等式
假如 a 和 b 就是單純的 一個(gè)bit位
那么在這兩次的連加中, 不管有沒有進(jìn)位,最后連加的結(jié)果的最低位一定等于a (這其中b是可以 == a的)
這是二進(jìn)制加法的特性,但是要注意的是連加的次數(shù)一定要是2的倍數(shù),而且連加的被加數(shù)b一定要不變 (這其中b是可以 == a的)
有了這個(gè)特性我們回過頭去看xor
上面說了xor相當(dāng)于不進(jìn)位的加法,所以 a+b+b 最后計(jì)算的結(jié)果所有的進(jìn)位全被舍棄,自然而然保留的結(jié)果一定 == a
現(xiàn)在將a和b括展到多個(gè)bit位,那么原理是一樣的, a xor b xor b, 還是相當(dāng)于 a + b + b, xor會(huì)將每個(gè)對(duì)應(yīng)的 bit位 都做 連續(xù)的加法,由于是不進(jìn)位的,所以每次對(duì)應(yīng)的bit位的連加是互不影響的,所以最后整個(gè)結(jié)果 所有的二進(jìn)制bit位都相沒有變, 所以最后的結(jié)果一定是a
- xor上述這樣的運(yùn)算特性,可以做一些簡(jiǎn)單的加密
RAID(獨(dú)立硬盤冗余陣列)
這種技術(shù)用許多塊硬盤組成一個(gè)RAID集, RAID技術(shù)主要優(yōu)勢(shì)在于數(shù)據(jù)冗余,也就是說即便其中一塊硬盤壞了,整個(gè)系統(tǒng)也可以設(shè)法把丟失的數(shù)據(jù)重新構(gòu)建出來,從而正常運(yùn)作下去,其中重建數(shù)據(jù)這一步可以通過xor來完成
5塊硬盤,其中4塊用來保存數(shù)據(jù),另一塊用來作校驗(yàn), 作校驗(yàn)的這塊硬盤的數(shù)據(jù)是其它4塊通過xor得到的
意思就是 校驗(yàn)盤的每個(gè)二進(jìn)制位 == 其它4塊盤對(duì)應(yīng)的bit位xor計(jì)算出來,這樣如果4塊盤中一任何一塊損壞了, 就可以拿余下的3塊先做xor得出的結(jié)果再和校驗(yàn)盤xor后就能還原出被損壞的盤的數(shù)據(jù)
eg:
a = 0b1
b = 0b0
c = 0b1
d = 0b1
校驗(yàn)盤 f = 1 xor 0 xor 1 xor 1 = 1
現(xiàn)在 c盤壞掉了, 那么
a xor b xor d xor f
===>1 xor 0 xor 1 xor 1 = 1
這其中的原理和上面是不同的, 現(xiàn)在我們來分析下 為什么能還還原出來
首先
f = a + b + c + d
(做不進(jìn)位的加法)然后現(xiàn)在
c
壞掉了c = a + b + d + f
我們可以將a + b + d
看成一個(gè)整體x
整個(gè)式子化簡(jiǎn)成f = x xor c
根據(jù)上面的分析可以理解成加法(不進(jìn)位),那么式子可以看作是
f = x + c
所以c = x - f
為什么寫成這樣, 因?yàn)槲覀冊(cè)谶壿嬌蠈⒌仁睫D(zhuǎn)換了, 現(xiàn)在來分析這樣一個(gè)減法等式
c = x - f
我們認(rèn)知的邏輯世界里這樣的轉(zhuǎn)換是沒有問題的,那么這種轉(zhuǎn)換在計(jì)算機(jī)看來是否正解呢?
答案是沒有問題的
從2個(gè)方面可以說明問題:
第一:計(jì)算機(jī)是人類造出來的,當(dāng)然遵循人類的思維,只不過內(nèi)部表現(xiàn)的不一樣
第二:計(jì)算機(jī)會(huì)將這個(gè)等式轉(zhuǎn)換成加法等式,即 c = x + (-f),這其實(shí)和我們?nèi)祟惖霓D(zhuǎn)換是一樣的
最后 得出的等式
c = x + (-f)
如果這個(gè)時(shí)候 我明確的告訴你f = -f
,那么就意味著c = x + f
===>c = x xor f
,就意味著這個(gè)算法是成立的了
我們來復(fù)習(xí)一下補(bǔ)碼 計(jì)算補(bǔ)碼的方法這里就不說了
上面所有和操作都是有一個(gè)前提就是xor 是不進(jìn)位的加法
,而且是對(duì)bit位操作
, 所以f == -f
根據(jù)補(bǔ)碼算出來的他們的最低bit位一定一樣
假設(shè) 8位
0的補(bǔ)碼0
-1的補(bǔ)碼 = 0b11111111
他們的正負(fù)數(shù)最低位都是相同的
所以 f == -f在這種情況下可以看作是成立的
所以 上面的 RAID的算法是成立的
這同時(shí)也說明了 xor的另一個(gè)結(jié)論 a = x xor b 那么 b = x xor a 一定成立,xor可以當(dāng)作不進(jìn)位的加法,也可以當(dāng)作減法,這個(gè)過程就是上術(shù)對(duì)RAID的分析
如果括展到多個(gè)bit位的時(shí)候,也是一樣的, 因?yàn)閤or的操作就是針對(duì)bit位的, 每一個(gè)bit位的過程都是這樣的互不影響的