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.";
}
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.";
}
Keys
enumを見ると、これは属性付きのフラグ列挙型です。[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
かどうかをチェックします
これはブール論理です (& = "bitwise and")。変数に値が含まれているかどうかを確認します。フィルターのようなものです。
例:
a -> 00110011
b -> 00000011
a&b -> 00000011
あなたのコードで
if ((e.Modifiers & Keys.Shift) == Keys.Shift)
Keys.Shift が e.Modifiers に含まれていることを確認します。
単一のアンパサンドは、ビットごとの AND 演算子を参照します。[Flags]
列挙型が行う属性を持つ列挙型と組み合わせて使用 すると、Keys
その列挙型のビットの1つが設定されているかどうかを判断するために示したように使用されます。
複数の修飾キーが同時に押される可能性があるため、直接比較の代わりに使用されます。
enum フラグの詳細については、こちらを参照してください。「ビット フラグとしての列挙型」というタイトルのサブセクションまでスクロールします。これによく似たサンプルが表示されます。
単一のアンパサンド (&) は、ビットごとの 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 (&&) が最適なオプションになります。true
true
true
あなたの例では、コードは 内の個々のビットと 内の個々のビットを比較していe.Modifiers
ますKeys.Shift
。どちらの引数もブール値を表さないため、演算はブール値 (&&) ではなくビット単位 (&) になります。
単一のアンパサンド (&) はビット単位の AND であるため、基本的には (a & b) の値を加算し、(a & b) == b で等しいかどうかをテストします。
したがって、あなたの例では、基本的にシフトキーが押された場合(任意のキー+シフト)==シフトと言っています。