这句话在c#中是什么意思?
本文关键字:意思 是什么 这句话 | 更新日期: 2023-09-27 18:09:45
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]
属性的标志enum。
仅当要对数字值执行位操作(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
这是布尔逻辑(&= "按位和")。检查变量是否包含值。它就像一个过滤器。
示例:
a -> 00110011
b -> 00000011
a&b -> 00000011
在你的代码
if ((e.Modifiers & Keys.Shift) == Keys.Shift)
检查键。Shift包含在e.Modifiers中。
单个&符号表示位与操作符。当与带有[Flags]
属性的枚举(Keys
枚举具有此属性)结合使用时,如您所示,它用于确定该枚举的某个位是否已设置。
可以同时按下多个修饰符键,这就是为什么使用它而不是直接比较的原因。
你可以在这里阅读更多关于枚举标志的信息。向下滚动到标题为"作为位标志的枚举类型"的小节。您将看到一个与此非常相似的示例。
单个&符号(&)是位与,所以它基本上是将(A &B),然后检验(a &B) == B
所以在你的例子中,它基本上是说如果shift键被按下(任何键+ shift) == shift。
它使用按位操作来查询是否设置了"标志"(位)(等于1)。
最好在http://msdn.microsoft.com/en-us/library/vstudio/cc138362.aspx上阅读枚举和位运算
&
是位与运算符。它所做的是Keys
是一个标志枚举,Keys
中的值可以是几个值的按位组合。因此,要测试任何特定的值,您首先将您的值与您想要测试的值进行和,然后将其与您想要测试的值进行比较。
e.Modifier
中的值将是Keys.Shift
和Keys.Ctrl
的按位组合。所以这:e.Modifier == Keys.Shift
是错误的。按住Shift键,同时按住Ctrl键。如果您想知道Shift键是否被按下而不管其他键是否被按下,您需要首先过滤掉所有其他键。这很容易通过使用Keys.Shift
作为过滤器来完成:
(e.Modifier & Keys.Shift) == Keys.Shift
如果shift键被按下而不管其他键被按下,该值为真,否则为假。
第1部分
是逻辑与运算符
当需要在一个标志中设置多个标志时使用,例如Integer:
例如,a是3,表示二进制记数法中的00000011。例如,B是2,在二进制表示法中表示00000010。
当你想检查a是否有b表示集合的标志(从右数第二个位)时,你可以使用AND操作符:
,B = 00000010
当这个等于b(或者是> 0),你就知道这个标志被设置了。
第2部分相等操作符也可以用于您想要检查是否"键。"Shift"是唯一的"修饰符"键,其他键都不按。当您使用第一个代码时,也可以按下其他"修饰符"键,并且if条件仍然为真。
单个&符号(&)执行逐位与操作;双&符号(&&)执行布尔与操作。
按位操作,并对两个参数的每个位执行与操作(因此称为"按位")。因此,按位与运算(或任何按位运算)的输出将不会是布尔值。以下是一些逐位与操作的示例:
1001 & 0001 = 0001
1101 & 1111 = 1101
布尔与运算对两个布尔值进行操作并返回一个布尔值:
true && true = true
false && true = false
短路
布尔与运算(&&)也可以在两个返回布尔值的表达式上执行:
int a = 5;
int b = 10;
bool result = (a < 3) && (b > 3);
// result will be false;
因为第一个表达式(a < 3)
求值为false
,所以结果不可能是true
,因为两个表达式都必须求值为true
才能得到true
。因此,第二个表达式甚至不会被求值。这被称为"短路"。但是,对于逐位与操作,两个表达式都需要在执行操作之前求值。因此,在大多数情况下,当您只想确定两件事是否为真(布尔)时,布尔AND (&&)将是最佳选择。
在您的示例中,代码将e.Modifiers
中的单个位与Keys.Shift
中的单个位进行比较。两个参数都不表示布尔值,因此操作是按位(&)而不是布尔(&&)。