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

Ale*_*tte 3 c++ bit-manipulation bitmask

这里有点难题.

我有4位,命名为顺序一个.它必须根据2个掩模进行修改:Ç.B是一个掩码,告诉我们要修改哪个A位,C告诉我们要应用于A的值.在我的情况下,C总是1111或0000,但我也会对一般答案感兴趣.

例如,让我们从:

A = 0000
B = 0001
C = 1111

// Then the result should be:
D = 0001
Run Code Online (Sandbox Code Playgroud)

一个不那么简单的例子:

A = 0001
B = 1010
C = 1111

// Then the result should be:
D = 1011
Run Code Online (Sandbox Code Playgroud)

并展示一个不同的C:

A = 1011
B = 0010
C = 0000

// Then the result should be:
D = 1001
Run Code Online (Sandbox Code Playgroud)

使用按位运算在C++中实现此目的的最佳(最简洁,可读和有效)方法是什么?

DAl*_*Ale 6

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

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

    首先,我们需要的那些位设置A1这等于1在这两个BC

    D = A | (B & C)
    
    Run Code Online (Sandbox Code Playgroud)

    然后我们需要将那些位设置为0等于1in B和等于0inC

    D = D & ~(B & ~C)
    
    Run Code Online (Sandbox Code Playgroud)

    或者有点简单

    D = D & (~B | C) 
    
    Run Code Online (Sandbox Code Playgroud)

  • 那么这是一个不同的问题,有不同的解决方案:-) (3认同)