我试图在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
我将如何解决这个问题?
答案 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)
。也就是说,屏蔽来自new
和previous
的相应位,并使用OR将它们加在一起。