0

重複の可能性:
この&演算子はここでどういう意味ですか?

マクロSDL_BUTTONの直前にあるifステートメントの&がなぜですか?それは何をするためのものか?このコードが何をするのか理解するのを手伝ってください。

if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1))
    //code to be executed
4

1 に答える 1

7

これはビット単位の「and」演算であり、の結果を取得SDL_GetMouseState(NULL, NULL)し、それを。の結果に「anding」しSDL_BUTTON(1)ます。

つまり、結果は整数値であり、両方の回答で1であるすべてのビットが最終結果で1になります。

事実上、これはSDL_BUTTON(1)が現在押されているかどうかを確認しています。他の同時マウス押下と組み合わせてもボタン1が押された場合、これはtrueと評価されるため、==比較ではなくこれを実行します。

ビットごとのANDの説明

私が以下を持っているとしましょう:int foo = 25; 私はこれをいくつかの異なるベースで見ることができます。通常の基数は10(10進数)です。日常生活の中で日常的に数字を見るベース。10進数では、この数は25です。基数2(2進数)の数値も確認できます。2進数では、数値はとして表され11001ます。その数は、いくつかのビットが「真」(1)で、いくつかのビットが「偽」(0)であると解釈できます。「真の」ビットはすべて、列内の位置に関連付けられた固定値を取得します。各列の値は2^iです。ここで、iは列のインデックスです。列には右から左に番号が付けられ、右端の列は番号0になります。

Truth value:     1    1    0    0    1
Column value:   16    8    4    2    1

真であるすべての列の列値を取得し、それらを合計して値を取得します。この場合、1、8、および16は真の列にあるため、これらを合計します。1 + 8 + 16=25。

「ビットワイズ」など、2進数に対して他の操作を実行することもできます。Cには、andステートメントの2つのタイプがあります。論理積とビット単位と。論理的で、次の形式を取ります。

if (a && b) { // two & together is logical-and
   // do something
}

ステートメント// do somethingは、と解釈できる値を保持し、;と解釈できる値を保持している場合に実行atrue ますbtrue整数の場合、ゼロ以外の数値はすべてtrue。です。いずれかがfalseの場合、ステートメントは実行されません。

ビット単位で類似していますが、ビットレベルで動作します。2つの値を取り、一度に1ビットずつ比較して、出力値を決定します。ビットが両方の値で真の場合、出力のビットも真です。いずれかの値のビットがfalseの場合、出力のビットはfalseです。

int a = 25;    // 011001
int b = 13;    // 001101
int c = a & b; // 001001  -- or 1 + 8 == 9
if (c) {
   // do something if c is non-zero
}

上記のコードは、ビット単位の2つの値を取り、それをtrueまたはとして解釈していfalseます。SDLで使用されている正確な値はわかりませんが、の値としてSDL_BUTTON(1)との値がであるとしましょう。 各ビットがフラグを表す整数を返します。戻る(マウスボタン1が下がっている)場合、4 ()になります。戻った場合(マウスボタン2が押されている場合)、0になります( ;共通の列はありません)。12を返す場合(マウスボタン1と2が下がっている場合)、4()になります。4SDL_BUTTON(2)8SDL_GetMouseState(NULL, NULL)SDL_GetMouseState(NULL, NULL)44 & 40100 & 0100 == 010088 & 401000 & 00100 == 00000112 & 401100 & 00100 == 00100

マウスボタン1を押すと、結果は&ゼロ以外になりますtrue。マウスボタン1を押しマウスボタン2を押しても、結果はそのまま trueです。

于 2012-08-13T16:13:04.380 に答える