2

ビット演算を使用して、ビットマスクに従って2つのビットフィールドをマージすることは可能かどうか疑問に思います。たとえば、2つの値とビットマスクがあります。

char mask = 0x29; // 0010 1001
char a = 0x9;     // 0000 1001 original value
char b = 0xE8;    // 1110 1000 modified value

そして、ビットマスクに従って、bのビットをaの値に設定したいと思います。3ビットのみが影響を受けます。

char val = 0xC9;  // 1100 1001 value

では、ビット演算だけでどうすればよいでしょうか。

前もって感謝します。

4

3 に答える 3

5

次のようなものを試してください:

b &= ~mask;       /* Clear bits set in mask. */
b |= (mask & a);  /* Add bits set both in a and in mask. */

また、unsigned不確定の代わりに型を使用することもできますchar

于 2012-08-10T11:02:36.470 に答える
3
val = a ^ ((a ^ b) & mask); 

また動作します。通常、それ自体は実際には役に立ちませんが、状況によっては役立つ場合があります。たとえばa、とbが両方の定数である場合、通常の式よりも単純化できます。

于 2012-08-10T11:18:29.900 に答える
2

まず、からマスクに設定されているビットをクリアしますb。次に、からマスクに設定されていないビットをクリアしますa。最後にOR、2つの結果を一緒に:

b = (b & ~mask) | (a & mask);

チルダ~演算子は、否定されたマスクを生成します。マスクに設定されているビットAND~maskゼロで処理します。b

于 2012-08-10T11:02:57.370 に答える