2017-04-11 9 views
2

デバッガを見ると、1ビットが一定の値に設定されているかどうかを確認する必要があることがわかりました。C++メモリから1ビットを読み込みますか?

たとえば、このメモリアドレス0x12345には、これらの4バイトの01008100が格納されているとします。その正確なポイントには8しかないかどうかを確認するにはどうすればよいですか?申し訳ありませんが使用する言葉の不足している、私は本当に説明する方法もわからない。しかし、例えば、私はチェックしたい場合8は私の最初の推測の上に掲示それらのバイトでその正確な位置で右があった場合には、この

if(*(char*)(0x12345 + 0x2) == 8) 
{ 
    //ok 
} 

ような何かをしようとするだろう。しかし、それは読んでますので、これはobivously動作しません。値が0x81である場合、8がある場合にのみ読み込み、その前または後ろの他のビットはすべて無視する必要があります。うまくいけば、この質問は、少なくとも誰かが私の質問を理解する方法で言われました。読んでいただきありがとうございます。

+0

「8」はこの場合1ビットではなく、バイトの16進表現の1桁です。 – Drax

答えて

0

ビット単位のAND(&)を使用して、個々のビットをテストすることができます。 AND演算マスクアウトビットを使用すると、例えば、に興味がないことを

if ((*(char*)(0x12345 + 0x2) & 0x80) == 0x80) 
{ 
    //ok 
} 

注意

0x12345 + 0x2: 10000001 ; 0x81 

AND with 0x80: 10000000 ; 0x80 
+0

は '&0x80でなければなりません)== 0x80' – Matthias247

+0

@ Matthias247:ありがとうございます。 –

0

4バイト値の特定のビットが設定されているかどうかを確認したいようです。

if((*(std::uint8_t*)(0x12345 + 0x2) & 0x80) != 0) 
{ 
    // the bit is set 
} 
:あなたは、私はあなたが指定したものと同様のものを使用することになり、バイトのストリーム上の、およびNOT 32ビット値にビットをチェックしたいが、私はビット単位や演算子を使用すると仮定すると

uint32値のビットをチェックする場合、使用しているマシンのエンディアン(高または低ビットエンディアン)を考慮する必要があります。

正しいデータ型を指定すると、マシンはそれを処理します。

// Note: 0x12345 is a fictional address, not properly aligned on some architectures 
if((*(std::uint32_t*)0x12345 & 0x00008000) != 0) 
{ 
    // the bit is set 
} 
+1

@Raul R:フィードバックに感謝します。コメントを見やすくするためにコメントを移動しました –

関連する問題