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

时间:2012-05-30 14:32:42

标签: 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 ) );
}

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

真相表是:

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

我将如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

使用Karnaugh Map - 在线提供solver。选择“三个值”,输入所有八个组合的预期结果,并使用求解程序产生的表达式:

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

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

result = (mask & new) | (~mask & previous);

答案 1 :(得分:3)

  

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

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