22

マスクを使用して、バイト内の特定のビットを操作しようとしています。例えば:

特定の位置 (位置 0 のビットと 3 番目の位置のビット) で 2 つのビットを反転するプログラムを C で作成したいと考えています。したがって、11100011は になり01110011ます。

これらのビットを交換するにはどうすればよいですか?

4

4 に答える 4

34

ビットの反転は、マスクを使用した XOR によって行われます。反転する位置にビットを設定し、次のように XOR を実行します。

int mask = 0x90; // 10010000
int num  = 0xE3; // 11100011
num ^= mask;     // 01110011

以下にいくつかの注意事項を示します。

  1. ビットは通常、最下位の位置からカウントされるため、この例では、位置 0 と 4 ではなく、位置 4 と 7 でビットを反転します
  2. 1 つの位置のビット マスクを作成するには、式 を使用します1 << n。ここで、nは最下位ビットから数えた位置番号です。
  3. 複数のビットを 1 つのマスクに結合するには、|演算子を使用します。たとえば、(1 << 4) | (1 << 7)ビット 4 と 7 を反転するためのマスクを作成します。
于 2013-10-27T10:57:04.650 に答える
1

ビットを反転するには、排他的 OR ビット演算子を使用できます。これは 2 つのオペランドを取ります (通常、操作対象の値と、反転するビットを定義するマスク)。排他的 OR (XOR) 演算子は、2 つのうちの 1 つが 1 に設定されている場合にのみビットを反転しますが、両方は反転しません。以下の (単純な) 例を参照してください。

#include <stdio.h>

int main(int argc, char** argv)
{
   int num = 7;   //00000111
   int mask = 3;  //00000011

   int result = num ^ mask; //00000100
   printf("result = %d\n", result); //should be 4

   return 0;
}
于 2013-10-27T11:19:14.253 に答える
1

まず第一に、頑張ってください!

1 つの注意点 - さまざまなバイト/ワード サイズ (8 ビット、16 ビットなど) があり、そのカウントにより互換性が維持されるため、左ではなく右からビットをカウントする方が便利です。したがって、あなたの場合、ビット #7 と #4 (ゼロカウント) を参照しています。

「反転」(0<->1 ビットの変更) または「切り替え」という意味ですか?

最初のオプションについては、上記の回答 ("int mask = 0x90; // 10010000" との XOR) が非常に適切です。2 番目の場合は、もう少しトリッキーです (ただし、それほど多くはありません)。

于 2013-10-27T11:00:56.270 に答える