私は、マスクを使用して、バイト内の特定のビットを操作しようとしています。 例:Cのバイトの特定のビットを反転する方法は?
私は、特定の位置に2ビットを反転するC言語のプログラムを書いておきます。位置0のビットと第3位置のビット。 だから11100011
は01110011
になります。
これらのビットを交換するにはどうすればよいですか?このように、XORをセットビットを使用すると、反転したい位置で、次に実行します:
私は、マスクを使用して、バイト内の特定のビットを操作しようとしています。 例:Cのバイトの特定のビットを反転する方法は?
私は、特定の位置に2ビットを反転するC言語のプログラムを書いておきます。位置0のビットと第3位置のビット。 だから11100011
は01110011
になります。
これらのビットを交換するにはどうすればよいですか?このように、XORをセットビットを使用すると、反転したい位置で、次に実行します:
はビットがマスクとXORすることによって行われひっくり返すここ
int mask = 0x90; // 10010000
int num = 0xE3; // 11100011
num ^= mask; // 01110011
は、いくつかのノートです。 、
1 << n
を使用しますここではn
は、最下位ビットから数えて位置番号です。|
演算子を使用します。例えば、(1 << 4) | (1 << 7)
は、ビット4と7をフリップするためのマスクを構成します。まず、幸運にも!
1つの発言 - さまざまなバイト/ワードサイズ(8ビット、16ビットなど)があり、その数が互換性をよりよく保持するため、右からビットを数えておくと便利です。したがって、あなたの場合、ビット#7と#4(ゼロカウント)を参照しています。
「フリップ」(0から→1ビットに変更)または「切り替え」を意味しましたか?
最初のオプションでは、上記の答え( "int mask = 0x90; // 10010000"のXOR)は非常に優れています。 2つ目は、もう少しトリッキーです(ただしあまりありません)。
ありがとう!私はスイッチを意味した! –
喜んで助けてください!ちなみに、良い答えのための "投票"はあなたの感謝を示す良い方法です;-) – AssafR
ビットを反転するには、排他的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;
}
:下記(シンプル)の例を参照してください
x = x^((1<<i) | (1<<j));
だから、あなたに場合、それはちょうど(1 < < 4)| (1 < < 7)。 :)
Googleのブール代数と真理値表に具体的な答えがあります。 –