• ベストアンサー

#defineの宣言

C++のコード解読を行っていますが、以下の内容がよく分かりません。 #define CTL_CODE( DeviceType,Function,Method,Access) ( \ ((DeviceType) << 16 | ((Access) << 14) | ((Function) << 2 | (Method) \) 宣言をして、その要素の中身をbitシフトしてOR演算しているのは、何となく分かります。 具体的な例を入れて説明して頂ければ、助かります。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

A#1です。 自分でも分かりづらいなと思ったので、図を書きかました。 このように、数値が埋まっていきます。 マクロを読み出す方は、何も考えずとも、 DeviceTypeやらを10進数の数値で入れておけばいいので、 可読性が増すと考えてください。

その他の回答 (2)

回答No.2

> その要素の中身をbitシフトしてOR演算しているのは、何となく分かります。 > 具体的な例を入れて説明して頂ければ、助かります。 そのもので、それ以上の説明は必要ないと思いますが。 具体的な例と言われても、実際の DeviceType, Function, Method, Access の値はわからないので意味はないと思います。 このマクロは多分複数の情報(データ)を一つのデータ(多分32ビット長)にまとめるものです。 DeviceType:最大16ビット、つまり0~65535の範囲の数値 Access:最大2ビット、つまり0~3の範囲の数値 Function:最大12ビット、つまり0~4095の範囲の数値 Method:最大2ビット、つまり0~3の範囲の数値 を組み合わせて32ビットの値を作ります。 32ビット長のデータをビット毎に□を並べて書いて右から二つがmethod, 次の12個がFunction 次の二つがAccess, 残りがDeviceTypeということです。 C++ではこのようなマクロは推奨されていません。関数に書き直すことをお勧めします。

0333
質問者

お礼

回答ありがとうございました。 なるほど、マクロ定義は止めようと思います。

回答No.1

こんにちわ。 本来は、DeviceTypeが何ビットで、Functionが何ビットで・・・と定義されていないと、オーバーフローを起こして、 他のフィールドに被る可能性があるのですが、 それが起きないとして、説明申し上げますね。 たとえば、32bitの変数があるとします。 (与式の場合、DeviceTypeが16bit左シフトしているので、それ以上の幅がないといけません) その32bit変数は、Defineマクロを呼び出すことで、 [DeviceType] [Access] [Function] [Method] というように並べられることになります。 その境界線は・・・ DeviceType: 31 - 16bit Access: 15 - 14bit Function: 13 - 2 bit Method: 1-0 bit となります。 上記は何かの命令なのかな?と思いますが、 この様に、orとシフトを合わせることで、 4バイトにすべてを押し込めている、と思っていただくと良いのではと思います。

0333
質問者

お礼

早速の回答ありがとうございました。

関連するQ&A