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

カルノー図を使用する-オンラインで利用できるソルバーがあります。「3つの値」を選択し、8つの組み合わせすべてに対して期待される結果を入力し、ソルバーが生成する式を使用します。

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

編集:~ビット単位のNOT演算子を使用すると、このソリューションを拡張して、一度に1ビットずつ実行するのではなく、バイト全体を一度に実行できます。

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

マスクビットがtrueの場合は新しいビットを使用し、そうでない場合は前のビットを使用します

これを(私にとって)表現する自然な方法は(mask & new) | (~mask & previous)です。つまり、とからの対応するビットをマスクしnewpreviousORを使用してそれらを加算します。

于 2012-05-30T15:02:28.637 に答える