这些位运算在做什么

What are these bitwise operations doing

uint sum = generateSum();
int forced = getForcedBitfield();
int previousSum = getPreviousSum();

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

最后一行到底在做什么?总和是 32 个布尔值。这是一个位域。 Forced 是位域,previousSum 是位域。

用简单的英语来说,最后一行是做什么的? (不是操作,我知道它不是强制的,并且它与 sum 然后将它添加到强制与之前的总和)

这将有选择地从两个值 (sumpreviousSum) 中选取位,其中 "on" 位来自 previousSum,"off" 位来自sum.

因为加法运算的两个操作数互斥位设置为 1,所以在这种情况下,加法与布尔运算具有相同的效果。

这就像使用模板来组合两个图像。

要了解其工作原理,让我们使用 4 位值:

forced = 0011 (and ~forced = 1100)
previousSum = 0110
sum = 1111
~forced & sum = 1100
forced & previousSum = 0010

两个值中都没有位是"on",所以求和和OR一样,效果等于从两个valid中选择位构造一个新值。