2015-12-14 56 views
2
uint sum = generateSum(); 
int forced = getForcedBitfield(); 
int previousSum = getPreviousSum(); 

sum = (~forced & sum) + (forced & previousSum); 

最後一行究竟是幹什麼的?總和是32個布爾值。這是一個位域。強制是一個位域,previousSum是一個位域。這些按位操作是做什麼的

用普通英語最後一行是幹什麼的? (不操作,我知道窮人被迫與和ANDS它,然後會將此與先前的和強制相與)

+2

無法分辨,直到提供更多上下文。 –

+0

它從'sum'中取出所有未被強制的位(即'〜forced'在那裏有一個1),並將該和加到'previousSum',從而'forced'在加法之前選擇'previousSum'中的位。 –

+1

我想把這些位字段變成數組,並且我需要將按位邏輯變成正則邏輯...... – jmasterx

回答

4

這將有選擇地從兩個值(sum & previousSum),其中「上」位來自接位previousSum和「關」位來自sum

因爲加法運算的兩個操作數的互斥位被設置爲1,所以加法的效果與布爾Or相同。

這就像使用模板合併兩個圖像。

要看到這是如何工作,讓我們使用4個值:

被迫= 0011(和〜被迫= 1100)
previousSum = 0110
總和= 1111
〜被迫&總和= 1100
被迫& previousSum = 0010

沒有比特被 「接通」 這兩個值,所以總和爲s ame作爲OR,效果等同於從兩個有效位中選擇位來構造新的值。

+4

也許你可以在答案中指出'+'與'|'在這種情況下是一樣的,因爲'forced&x'和'〜forced&x'表示不能有任何進位?這可能是提問者混淆的根源。 – 31eee384

+0

因此,對於總和中的每一位...如果sum [x]不是強制的,則使用previousSum [x] else else sum [x]? – jmasterx

+0

如果被迫然後previousSum,否則總和。 –