2015-12-14 30 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,否则总和。 –