来自以下肖恩安德森的页面: http://graphics.stanford.edu/~seander/bithacks.html#MaskedMerge
他说[(&〜mask)|的结果(b& mask)] 可以写成[a ^((a ^ b)& mask); ]
从问题陈述中,直观地做[(a&〜mask)| (b& mask)]。但是我如何从第一个表达式中导出后面的表达式呢?有线索吗?
答案 0 :(得分:1)
直观地,& bits
表示“取这些位”,^ bits
表示“翻转这些位”。
原始表达式(a & ~mask) | (b & mask)
表示“从掩码选择的b
中获取位,并从a
”中取出其余位。
让我们从(b & mask)
开始 - 掩码选择的b
位。
a ^ (b & mask)
会翻转一些内容 - 即a
的1位。这几乎是正确的。但是,我们实际上并不想翻转由掩码选择的a
的1位。要更正a
和mask
均为1的位置中的这些位,我们再次翻转它们:a ^ ((a ^ b) & mask)
。