- ベストアンサー
#defineの宣言
C++のコード解読を行っていますが、以下の内容がよく分かりません。 #define CTL_CODE( DeviceType,Function,Method,Access) ( \ ((DeviceType) << 16 | ((Access) << 14) | ((Function) << 2 | (Method) \) 宣言をして、その要素の中身をbitシフトしてOR演算しているのは、何となく分かります。 具体的な例を入れて説明して頂ければ、助かります。 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- maru_yoshi_
- ベストアンサー率39% (17/43)
> その要素の中身を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++ではこのようなマクロは推奨されていません。関数に書き直すことをお勧めします。
- naznaz1111
- ベストアンサー率46% (64/138)
こんにちわ。 本来は、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バイトにすべてを押し込めている、と思っていただくと良いのではと思います。
お礼
早速の回答ありがとうございました。
お礼
回答ありがとうございました。 なるほど、マクロ定義は止めようと思います。