2009-05-13 14 views
2

私はWin32のGUIコードを見るときにこれを見るのが普通です。私の前提は、それがビット単位の標準であるということですが、私は時々C#でそれを見ています。同じことを行うより良い(より高いレベルの)方法があるようです。|関数呼び出しの演算子の意味ですか? [C++]

MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 

おかげで、

シーマス

答えて

17

|ビットごとのORです。 MB_OKとMB_ICONEXCLAMATIONは、2の累乗(32や128など)で定義されているため、ビット単位の論理和で結合することができます(128 | 32は2ビットが設定された160です)。ビットがフラグとして使用される場合、これは正常です。

+5

また、関数呼び出しに固有のものではなく、どこでも同じように動作することに注意してください。 –

5

それは他の場所のようなビット単位のOR演算子だ:とにかく、ここでは一例です。基本的に、この技術は、相互排他的ではないいくつかの属性を設定する場合に使用されます。

機能は、簡単にこのようないくつかのコードでそれらを確認することができます。

if (arg & MB_ICONEXCLAMATION) { // Show an exclamation icon... 

} 

// ... 

if (arg & MB_OK) { // Show an OK button 

} 
+0

これは、0001と0010などのフラグを組み合わせて、hackish(?)の可変引数関数呼び出しを0011にするのに使われると思います。 –

+0

Windows APIの一般的なテクニックです。はい、そのとおり。 –

+0

* nixシステムコールを含む多くの場所で共通のテクニックです。たとえば、open()のモードとフラグを見てみましょう。長いパラメータを使用して32個までのフラグのコレクションを渡してAPIの詳細を制御すると、スタックの効率的な使用が可能になります。また、ユーザースペースからシステムコールに必要なシステムスペースをあなたが想像するより洗練された方法。 – RBerteig

0

それはビット単位を行いますか。

int x = 5 | 3; // x == 7 now

+0

いいえ、5のバイナリは101、3のバイナリは011なので、5 | 3はバイナリ111または7です。 –

+0

あなたはあなたの数学をチェックする必要があると思います。 5 | 3は7です。(101)_2 | (011)_2 =(111)_2 – Welbog

+1

Ahhバイナリヘッドが痛い... –

12

ビットマスク用です。この信じられないほど単純な例を使用しましょう。色のバイナリ値があり、次の値があります。 = GREEN

100 = BLUE

RED 010 =

001あなたはSomeFunction(BLUE | RED | GREEN)を言うとき。あなたは本来、値111を渡しています。この値は、BLUEとREDとGREENを意味するようにデコードできます。

詳細はBitwise演算子をご覧ください。

+0

ありがとう、私はそれにいくつかの考えを与えていたと思う、私はこれがすべてのことだったことに気づいたでしょう。しかし、特にスタックのオーバーフローに関して私が推測することを傷つけることは決してありません。ありがとう! –

+1

問題ありません。もっと勉強して何も学ぶよりも、聞き取り、学ぶほうがいいです。それはWin32とMFC全体に散らばっているものの1つですが、それがどのように動作するか停止して考えるまで、それは魔法でもよいでしょう。 :) – Serapth

+0

これは本当に "マスキング"ですか?私は、「バイナリマスクを適用する」のように、&を「マスキング」に関連付けます。 – unwind

2

MB_ICONEXCLAMATIONとMB_OKをintよりも好きではない "オプション"と考えてください。あなたが気にしているのは、それらのintのビット表現です。

セイ:

//MessageBox.cs or whatever 
public static int MB_ICONEXCLAMATION = 0x1 // 0001 in binary 
public static int MB_OK = 0x2 // 0010 in binary 

あなたOR彼らは一緒に、あなたがバイナリで0011を取得します。だから、引数を1つだけ使用する代わりに、指定するオプションごとに1つずつ、引数を使用してMessageBoxの両方のオプションを要求しています。

関連する問題