这个位掩码合并是如何根据作者的建议得出的?

How is this bit mask merge derived to what author suggets?

来自以下 Sean Anderson 的页面: http://graphics.stanford.edu/~seander/bithacks.html#MaskedMerge

他说 [ (a & ~mask) | 结果(b & 面具) ] 可以写成 [ a ^ ((a ^ b) & mask); ]

从问题陈述来看,很直观的做法是 [ (a & ~mask) | (b & 面具)]。但是我如何从第一个表达式中导出后面的表达式呢?有什么线索吗?

直观上,& bits表示"take these bits",^ bits表示"flip these bits"。

原表达式(a & ~mask) | (b & mask)表示"take bits from b selected by the mask, and take the rest of the bits from a"。

让我们从(b & mask)开始——掩码选择的b的位。

a ^ (b & mask) 会翻转其中的一些位——即 a 的 1 位。这几乎是正确的。但是,我们实际上并不想翻转掩码选择的 a 的 1 位。为了更正 amask 都为 1 的位置的那些位,我们再次翻转它们:a ^ ((a ^ b) & mask).