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個臨時變...