应用基于不同掩码的位掩码

Applying a bit mask based on a different mask

这里有点困惑。

我有一个 4 位的序列,名为 A。它必须根据 2 个掩码进行修改:BCB 是一个掩码,告诉我们要修改 A 的哪些位,而 C 告诉我们应用于 A 的值。在我的例子中 C 总是 1111 或 0000,但我也对通用答案感兴趣。

例如,让我们从:

开始
A = 0000
B = 0001
C = 1111

// Then the result should be:
D = 0001

一个不那么简单的例子:

A = 0001
B = 1010
C = 1111

// Then the result should be:
D = 1011

并以不同的方式展示 C:

A = 1011
B = 0010
C = 0000

// Then the result should be:
D = 1001

在 C++ 中使用按位运算完成此操作的最佳(最简洁、可读和有效)方法是什么?

  1. 二进制C,可读版本:

     if (C) {
         D = A | B; 
     } else {
         D = A & ~B;   
     }
    
  2. 任意C:

    首先,我们需要在BC[=26=中设置A1的那些位等于1 ]

    D = A | (B & C)
    

    然后我们需要将这些位设置为 0,等于 B 中的 1C[=26= 中的 0 ]

    D = D & ~(B & ~C)
    

    或者简单一点

    D = D & (~B | C)