这个位掩码合并是如何根据作者的建议得出的?
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 位。为了更正 a
和 mask
都为 1 的位置的那些位,我们再次翻转它们:a ^ ((a ^ b) & mask)
.
来自以下 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 位。为了更正 a
和 mask
都为 1 的位置的那些位,我们再次翻转它们:a ^ ((a ^ b) & mask)
.