如果我有一个真值表,有没有办法确定我需要的真值表的按位表达式?

ash*_*gpu 3 c binary bit-manipulation

我试图在c中执行以下操作:

unsigned int mask;
unsigned int previous;
unsigned int new;
unsigned int out;

for( int i = 0; i < 8; ++i )
{
    bool bit_set = GET_BIT( mask, i );

    // If the mask bit is true, use the new bit, otherwise use the previous bit
    SET_BIT( out, i, GET_BIT( bit_set ? new : previous, i ) );
}
Run Code Online (Sandbox Code Playgroud)

但是我认为使用按位运算可能会更容易,更快捷.我有真值表,但我不知道如何获得我需要的表达式.

真相表是:

m | p | n | o
0 | 0 | 0 | 0
1 | 0 | 0 | 0
0 | 1 | 0 | 1
1 | 1 | 0 | 0
0 | 0 | 1 | 0
1 | 0 | 1 | 1
0 | 1 | 1 | 1
1 | 1 | 1 | 1
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题呢?

das*_*ght 6

使用卡诺图 - 在线提供解算器.选择"三个值",输入所有八个组合的预期结果,并使用求解器生成的表达式:

F(m, p, n) = (p & !n) | (m & n)
Run Code Online (Sandbox Code Playgroud)

编辑:你可以扩展这个解决方案,一次完成整个字节,而不是一次一个地做,通过使用~按位NOT运算符:

result = (mask & new) | (~mask & previous);
Run Code Online (Sandbox Code Playgroud)