uint sum = generateSum();
int forced = getForcedBitfield();
int previousSum = getPreviousSum();
sum = (~forced & sum) + (forced & previousSum);
最后一行到底在做什么?总和为32个布尔值。这是一个位域。强制是位字段,而presumSum是位字段。
用简单的英语来说,最后一行在做什么? (不是操作,我知道它不是强制的,并且与和相加,然后将其与先前的总和相加)
最佳答案
这将从两个值(sum
和previousSum
)中有选择地选择位,其中“ on”位来自previousSum
,“ off”位来自sum
。
因为加法运算的两个操作数的互斥位设置为1,所以在这种情况下,加法的作用与布尔或相同。
就像使用模具将两个图像组合在一起。
要查看其工作原理,让我们使用4位值:
强制= 0011(〜强制= 1100)
previousSum = 0110
总和= 1111
〜强制&之和= 1100
强制&以前的总和= 0010
两个值中没有位处于“ on”状态,因此求和与OR相同,其效果等同于从两个有效值中选择位以构造新值。