マスクを使用して、バイト内の特定のビットを操作しようとしています。例えば:
特定の位置 (位置 0 のビットと 3 番目の位置のビット) で 2 つのビットを反転するプログラムを C で作成したいと考えています。したがって、11100011
は になり01110011
ます。
これらのビットを交換するにはどうすればよいですか?
マスクを使用して、バイト内の特定のビットを操作しようとしています。例えば:
特定の位置 (位置 0 のビットと 3 番目の位置のビット) で 2 つのビットを反転するプログラムを C で作成したいと考えています。したがって、11100011
は になり01110011
ます。
これらのビットを交換するにはどうすればよいですか?
ビットの反転は、マスクを使用した XOR によって行われます。反転する位置にビットを設定し、次のように XOR を実行します。
int mask = 0x90; // 10010000
int num = 0xE3; // 11100011
num ^= mask; // 01110011
以下にいくつかの注意事項を示します。
1 << n
。ここで、n
は最下位ビットから数えた位置番号です。|
演算子を使用します。たとえば、(1 << 4) | (1 << 7)
ビット 4 と 7 を反転するためのマスクを作成します。ビットを反転するには、排他的 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;
}
まず第一に、頑張ってください!
1 つの注意点 - さまざまなバイト/ワード サイズ (8 ビット、16 ビットなど) があり、そのカウントにより互換性が維持されるため、左ではなく右からビットをカウントする方が便利です。したがって、あなたの場合、ビット #7 と #4 (ゼロカウント) を参照しています。
「反転」(0<->1 ビットの変更) または「切り替え」という意味ですか?
最初のオプションについては、上記の回答 ("int mask = 0x90; // 10010000" との XOR) が非常に適切です。2 番目の場合は、もう少しトリッキーです (ただし、それほど多くはありません)。