2013-10-27 84 views
13

私は、マスクを使用して、バイト内の特定のビットを操作しようとしています。 例:Cのバイトの特定のビットを反転する方法は?

私は、特定の位置に2ビットを反転するC言語のプログラムを書いておきます。位置0のビットと第3位置のビット。 だから1110001101110011になります。

これらのビットを交換するにはどうすればよいですか?このように、XORをセットビットを使用すると、反転したい位置で、次に実行します:

+1

Googleのブール代数と真理値表に具体的な答えがあります。 –

答えて

15

はビットがマスクとXORすることによって行われひっくり返すここ

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

は、いくつかのノートです。 、

  1. ビットは、一般に、最下位位置からカウントされるので、あなたの例ではない位置0に、4位および7のビットを反転し、4
  2. は、単一の位置のビットマスクを発現コンストラクト1 << nを使用しますここではnは、最下位ビットから数えて位置番号です。
  3. 複数のビットを1つのマスクで結合するには、|演算子を使用します。例えば、(1 << 4) | (1 << 7)は、ビット4と7をフリップするためのマスクを構成します。
0

まず、幸運にも!

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

「フリップ」(0から→1ビットに変更)または「切り替え」を意味しましたか?

最初のオプションでは、上記の答え( "int mask = 0x90; // 10010000"のXOR)は非常に優れています。 2つ目は、もう少しトリッキーです(ただしあまりありません)。

+0

ありがとう!私はスイッチを意味した! –

+0

喜んで助けてください!ちなみに、良い答えのための "投票"はあなたの感謝を示す良い方法です;-) – AssafR

1

ビットを反転するには、排他的ORビット演算子を使用します。これは2つのオペランドを取ります(通常、操作したい値と反転するビットを定義するマスク)。 eXclusive OR(XOR)演算子は、2つのうちの1つが1に設定されていても、両方に設定されていない場合にのみ、少し反転します。あなたのバイトをx、そしてあなたは、i番目とj番目の位置のビットを切り替えたい場合は

#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; 
} 
2

:下記(シンプル)の例を参照してください

x = x^((1<<i) | (1<<j)); 

だから、あなたに場合、それはちょうど(1 < < 4)| (1 < < 7)。 :)

関連する問題