2012-04-29 12 views
0

Bitwise ANDを使用して個々のバイトの値を抽出する方法を理解しようとしています。C++:Bitwise AND

私が持っているものは4バイト配列で、最後の2バイトを1つの2バイト値にキャストしています。次に、その2バイト値から元の1バイト値を抽出しようとしています。私のコードと値のスクリーンショットの添付ファイルを参照してください。

私が抱えている問題は、2バイト値の最後のバイトの値を取得できないことです。

Bitwise ANDでこれを行うにはどうすればいいですか?あなたの助けのための

Bitewise AND

おかげで、あなたはいくつかのビットシフト下位バイトに上位バイトからマスクされた値を変換するを追加する必要が

リチャード・ヒューズ

+0

実際にあなたが投稿コードで、 'X&0x00FF'デバッガに示すように、正しい結果が得られないので、私は何か分かりません期待される結果が来ると思いますか? –

+0

正直言って、((char *)&x)[1]は4 – rhughes

+0

のように4の結果を期待していました。David Rodriguezの答えを見てください。 –

答えて

4

私が抱えている問題は、2バイト値の最後のバイトの値を取得できないことです。

2バイトの整数は値3と4で構成されます(ポインタはa[1]です)。あなたのテストですでに見たように、マスク0xFFを適用して3を得ることができます。今度は4を取得するには、下位ビットを削除する必要があります。あなたの例では、マスク0xFF00を使用すると、効果的に3を16ビット番号から削除しますが、1024 == 2^10 - 3番目のビットである値1024 == 2^10である4を2バイト番号の上位バイトのままにします2番目のバイト(最小の代表値から数えて)

4を得るには、その結果を8ビット右にシフトできます。そうでなければ、右に移動するだけでマスクを無視することができます消える

4 == (x>>8) 

もっと興味深い結果テストビット単位と単一番号と協力することによって得ることができる。

int x = 7;    // or char, for what matters: 
(x & 0x1) == 1; 
(x & (0x1<<1)) == 2; // (x & 0x2) 
(x & ~(0x2)) == 5; 
+2

インデックスにアクセスする前に、配列がuint16_tにキャストされているため、16ビット変数の値は3と4にする必要があります。 – rhughes

+0

Interesting。だから2バイト目の値で2番目のニブルを欲しければ、(x >> 4)&0xF00 – rhughes

+0

* "のようにすると、2byteの数値の上位バイトに4を残します。 2^10 - 11番目のビットセット、2番目のバイトの2番目のビット "*実際は3番目のビット;) – delicateLatticeworkFever

3

+0

例がありますか?私は間違って今私は知っていると仮定して、xと0x00FFは2の0を持つように下位バイトになるでしょう。各数字はニブルを表していませんか? – rhughes

+0

@rhughes:問題は、 '0x00FF'ではなく' 0xFF00'マスクです。 'x&0xFF00'は' 0x0004'ではなく '0x0400'を生成します。 –

0

私が抱えている問題は、最後の バイトの値を2バイト値で取得できないことです。

「ウォッチ」テーブルがどこにあるか、より多くのコードが含まれているかどうかはわかりませんが、結果が正しいように見えます。覚えておいてください。そのうち1つは上位バイトなので、値は< <の8桁にシフトされます。リトルエンディアンマシンでは、上位バイトが2番目のバイトになります。

+0

私は今理解していると思います。 xと0x00FFは最初のバイトを削除しないので、単純に0に設定します。結果の値は0000 0000 <それぞれのバイナリ> – rhughes

+0

です。両方の値にビットが設定されていない場合、結果はゼロになります。したがって、0x00FFは上位バイトを「マスク」します。これらのビットは、マスク内になければ両方の値に設定できないためです。あなたが残しているのは、他の値の下位バイトに設定されているビットだけです。 – delicateLatticeworkFever