11

if ((a & b) == b)次のコード ブロックの意味は何ですか?

if ((e.Modifiers & Keys.Shift) == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}

なぜこのようにならないのですか?

if (e.Modifiers == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}
4

8 に答える 8

17

Keysenumを見ると、これは属性付きのフラグ列挙型です。[FlagsAttribute]

数値に対してビット演算 (AND、OR、EXCLUSIVE OR) を実行する場合にのみ、列挙に FlagsAttribute カスタム属性を使用します。

2 の累乗、つまり 1、2、4、8 などで列挙定数を定義します。これは、組み合わせた列挙定数の個々のフラグが重複しないことを意味します。

したがってe.Modifiers、複数の列挙型の組み合わせになる可能性があります。

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter

概念を説明するための非常に単純な仮定:

Keys.Shift  : 001 (1)
Keys.Cancel : 010 (2)
Keys.Enter  : 100 (4)

そう:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter equal 001 | 010 | 100 = 111

そして条件:

    e.Modifiers & Keys.Shift equal 111 & 001 = 001

その意味は:

 e.Modifiers & Keys.Shift == Keys.Shift

e.Modifiers含まれていない場合Keys.Shift:

e.Modifiers = Keys.Cancel | Keys.Enter (110)

したがって、結果は次のようになります。

e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift)

要約すると、この条件はe.Modifiers含むKeys.Shiftかどうかをチェックします

于 2013-04-17T15:10:29.880 に答える
5

これはブール論理です (& = "bitwise and")。変数に値が含まれているかどうかを確認します。フィルターのようなものです。

例:

a   -> 00110011
b   -> 00000011
a&b -> 00000011

あなたのコードで

if ((e.Modifiers & Keys.Shift) == Keys.Shift)

Keys.Shift が e.Modifiers に含まれていることを確認します。

于 2013-04-17T15:06:12.427 に答える
4

単一のアンパサンドは、ビットごとの AND 演算子を参照します。[Flags]列挙型が行う属性を持つ列挙型と組み合わせて使用​​ すると、Keysその列挙型のビットの1つが設定されているかどうかを判断するために示したように使用されます。

複数の修飾キーが同時に押される可能性があるため、直接比較の代わりに使用されます。

enum フラグの詳細については、こちらを参照してください。「ビット フラグとしての列挙型」というタイトルのサブセクションまでスクロールします。これによく似たサンプルが表示されます。

于 2013-04-17T15:06:17.700 に答える
3

単一のアンパサンド (&) は、ビットごとの AND 演算を実行します。2 つのアンパサンド (&&) はブール AND 演算を実行します。

ビット単位の and は、両方の引数の各ビットに対して AND 演算を実行します (したがって、「ビット単位」と呼ばれます)。したがって、ビット単位の AND 演算 (または任意のビット単位の演算) の出力は、ブール値にはなりません。次に、ビット単位の AND 演算の例をいくつか示します。

1001 & 0001 = 0001
1101 & 1111 = 1101

ブール AND は、2 つのブール値に対して演算を行い、ブール値を返します。

true && true = true
false && true = false

短絡
ブール AND 演算 (&&) は、ブール値を返す 2 つの式に対して実行することもできます。

int a = 5;
int b = 10;
bool result = (a < 3) && (b > 3);
// result will be false;

最初の式が に(a < 3)評価されるため、結果が になるには両方の式が評価される必要があるため、結果が にfalseなる可能性はありません。このため、2 番目の式は評価されません。これを「短絡」と呼びます。ただし、ビットごとの AND 演算では、演算を実行する前に両方の式を評価する必要があります。したがって、2 つのことが true (ブール値) かどうかを判断したいだけの状況では、ブール AND (&&) が最適なオプションになります。truetruetrue

あなたの例では、コードは 内の個々のビットと 内の個々のビットを比較していe.ModifiersますKeys.Shift。どちらの引数もブール値を表さないため、演算はブール値 (&&) ではなくビット単位 (&) になります。

于 2013-04-17T15:09:53.877 に答える
3

単一のアンパサンド (&) はビット単位の AND であるため、基本的には (a & b) の値を加算し、(a & b) == b で等しいかどうかをテストします。

したがって、あなたの例では、基本的にシフトキーが押された場合(任意のキー+シフト)==シフトと言っています。

于 2013-04-17T15:05:32.150 に答える