由異或實現兩個數的交換到RAID技術的資料恢復

2021-06-15 05:32:49 字數 1326 閱讀 4904

void swap(int &a, int &b)

上述**能夠實現a和b的數值交換。之所以能實現交換的原理如下:

"^"異或操作的基本原理是「同0異1」,譬如,a是十進位制的5,b是十進位制的12,按照異或操作運算如下:

a = 0101(a的二進位制)

b = 1100(b的二進位制)

#異或後

c = 1001(十進位制9)

c中為1的位是a和b中不相同的位異或的結果,為0的位是a和b中相同的位異或的結果。

基於這兩個規律:

1.任何乙個二進位制數與1異或後都會變成相反數。(如0^1=1,1^1=0)

2.任何乙個二進位制數與0異或後都會保持不變。(如0^0=0,1^0=1)

c中為1的部分是a和b中不同的,0的部分是相同的。那麼,a異或c的結果就是a和b不同的部分發生變化。由於二進位制只有兩種狀態,因此a就變成b了。

a = 0101

c = 1001

#異或後

b = 1100

其中,對raid5(raid分級的一種)進行分析。

如上圖,資料a,b,c,d分為塊狀(如資料 a,分為a1,a2,a3...ap)分散分布在四個磁碟上,其中ap為校驗塊。xp的計算公式為:xp=x1^x2^x3(x = a,b,c)。

加入xp校驗塊且按以上分布排列的好處:當乙個資料塊出錯時,可以利用剩餘的資料塊和校驗塊來恢復,提高了可靠性。演算法如下:

一般地,p為校驗塊,利用舊資料(假設是正確的)生產p,當新資料di出錯或缺失,可利用p和其餘的資料d來恢復。

利用異或特性,x^x=0,x^0=x,x^x^y=y.

p=d1^d2^d3^...^dn ( 1 <= i <= n)

di= p^d1^d2^d3^...^dn (not include di)

所以,在一塊盤掉線時,raid正常工作。例如上圖,當disk0掉線,a1,b1,c1可以通過上面公式,由軟體計算出來。

a1 = ap^a2^a3;

b1 = bp^b2^b3;

c1 = cp^c2^c3;

當然,如果有兩塊掉線的話就沒辦法了。

引用資料:

1.2.

3.

異或交換兩個數

void swap int a,int b 一般我們可以用異或來進行交換兩個數,以前我也不知道會有這個問題,最近在準備考研寫排序的時候,發現自己寫的swap函式在選擇排序的時候會出現個別0。通過查閱大佬們的部落格,發現問題是由於swap在對同乙個物件進行異或的時候,因為同乙個物件的位址是相同的,所以...

異或運算實現兩個數的交換

通常的交換兩個變數a,b的過程為 int temp temp a a b b temp 需借助上面的第3個臨時變數temp.採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需借助第3個臨時變數 a a b b a b a a b 這個交換兩個變數而無需借助第3個臨時變...

異或運算實現兩個數的交換

通常的交換兩個變數a,b的過程為 int temp temp a a b b temp 需借助上面的第3個臨時變數temp.採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需借助第3個臨時變數 a a b b a b a a b 這個交換兩個變數而無需借助第3個臨時變...