2

私は自分のシンプルな描画エンジンを作っています。ビット単位の比較と呼ばれるものを使用して、変数が特定の値に設定されているかどうかを判断しようとしていますが、間違っている可能性があります。

私はいつも、以下が何であるか、そしてそれをどのように使用するかについて少し混乱してきました:

int DRAW_REPEAT_X = 70001; // I have a feeling I should make this value binary instead of a unique number, ie, 0
int DRAW_REPEAT_Y = 70002; // I have a feeling I should make this value binary instead of a unique number, ie, 2
int drawMethod    = DRAW_REPEAT_X | DRAW_REPEAT_Y; // this means I want to repeat an image on both the x and y axis doesn't it?

// Now I want to check if drawMethod has DRAW_REPEAT_X set: this is where I struggle to know how to check this
// Is the following correct?
if (drawMethod && DRAW_REPEAT_X) {
  // the user wants me to repeat an image along the x axis
}

// Now I want to check if drawMethod has DRAW_REPEAT_Y set: this is where I struggle to know how to check this
if (drawMethod && DRAW_REPEAT_Y) {
  // the user wants me to repeat an image along the x axis
}

次のコードは、DRAW_REPEAT_Xが設定されているかどうかを正しくチェックしていますか?私のandingチェックでは常に1を返します。

編集 そして、両方のビットが設定されているかどうかを確認するには、これを行いますか?

if (drawMethod & DRAW_REPEAT_X & DRAW_REPEAT_Y) {
   // both set
}

// OR

if (drawMethod & DRAW_REPEAT_X && drawMethod & DRAW_REPEAT_Y) {
   // both set
}
4

4 に答える 4

9

これが機能するためには、フラグ変数ごとに単一の一意のビットが設定されている必要があります。そのビットが「フラグ」です。重要なのはビット単位の表現である定数の場合、10進数よりも16進数または8進数(これらの基数は2の累乗であるため)を使用する方がはるかに便利です。したがって、たとえば:

enum {
    DRAW_REPEAT_X = 0x01,    /* First bit set */
    DRAW_REPEAT_Y = 0x02,    /* Second bit set */
    DRAW_MIRRORED = 0x04,    /* Third bit set */
};

int drawMethod = DRAW_REPEAT_X | DRAW_REPEAT_Y;  /* Will have both first and second bits set */

次に&、論理的ではなくビット単位でビット&&をテストします。 a & bとの両方に少なくとも1つのビットが設定されている場合にのみ、ゼロ以外にaなりbます。フラグをテストする場合、これらの1つには1ビットのみが設定されます(対象のフラグ)。したがって、a & flagフラグが次のように設定されている場合に限り、結果はゼロ以外になりますa

if (drawMethod & DRAW_REPEAT_X) {
  // the user wants me to repeat an image along the x axis
}

if (drawMethod & DRAW_REPEAT_Y) {
  // the user wants me to repeat an image along the x axis
}

0x011ビットが設定され0x02た定数の16進パターンは、、、、、、、、.. ..0x040x080x100x20

于 2012-11-19T23:21:11.063 に答える
8

いいえ、そうではありません。代わりにビット単位のAND演算子を使用し&、フラグを2進値として設定する必要があります。その側の直感は正しいです。

特定のビットを設定するための一般的なトリックは、シフト演算子を使用することです。

int DRAW_REPEAT_X = 0x1 << 0;  //first bit set to 1, others 0
int DRAW_REPEAT_Y = 0x1 << 1;  //second bit set to 1, others 0

そしてintをチェックします

if (drawMethod & DRAW_REPEAT_X)  //check it that particular flag is set, ignore others
{
}
于 2012-11-19T23:12:36.253 に答える
0

現在のところ、メソッドを示す値を持つほどフラグを使用していません。はるかに良いのは、次のようなある種のビットを使用することです。

int DRAW_REPEAT_X=0x01;
int DRAW_REPEAT_Y=0x02;

そして、あなたが今しているように、しかし単一の&でifsをチェックします

if (drawMethod & DRAW_REPEAT_X)

クラスアーキテクチャで作業している場合、通常、整数(DRAW_REPEAT_X)は、である必要があります。public staticしかし、それが事実かどうかわからないので、私はそれらを含めません

于 2012-11-19T23:14:36.247 に答える
0

これは、WinAPIを使用して、値に2つのフラグを設定し、その値にそれらのフラグの少なくとも1つが存在するかどうかを確認するコードスニペットです。そうすべきreturn 0;

INPUT mip;
mip.type = INPUT_MOUSE;
mip.mi.mouseData = 0;
mip.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

if (mip.mi.dwFlags & (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_HWHEEL))
    return 0;

正確な値の組み合わせを確認する場合は、ビット演算子を使用する必要はなく&、簡単な==確認を行うことができます。

たとえば、下部近くの更新された行

INPUT mip;
mip.type = INPUT_MOUSE;
mip.mi.mouseData = 0;
mip.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

if (mip.mi.dwFlags == (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE))
    return 0;
于 2018-07-09T20:41:27.603 に答える