3

我正在尝试在 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 ) );
}

但是我认为使用按位运算可能会有一种更简单快捷的方法。我有真值表,但我不知道如何获得我需要的表达式。

真值表是:

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

我将如何解决这个问题?

4

2 回答 2

6

使用卡诺图- 有一个在线求解器。选择“三个值”,输入所有八种组合的预期结果,并使用求解器生成的表达式:

F(m, p, n) = (p & !n) | (m & n)

编辑:~您可以使用按位 NOT 运算符扩展此解决方案以一次执行整个字节,而不是一次执行一位:

result = (mask & new) | (~mask & previous);
于 2012-05-30T14:34:07.117 回答
3

如果掩码位为真,则使用新位,否则使用前一位

(对我来说)表达这一点的自然方式是(mask & new) | (~mask & previous). 也就是说,从new和中屏蔽相应的位previous,并使用 OR 将它们相加。

于 2012-05-30T15:02:28.637 回答