这句话在C#中是什么意思?

这句话在C#中是什么意思?,c#,if-statement,C#,If Statement,如果((a&b)==b)在以下代码块中是什么意思 if((e.Modifiers&Keys.Shift)=Keys.Shift) { lbl.Text+=“\n”+“按住Shift键。”; } 为什么不是这样 if(e.Modifiers==Keys.Shift) { lbl.Text+=“\n”+“按住Shift键。”; } 单个与(&)是位AND,因此它基本上是将(A&b)的值相加,然后测试(A&b)==b中的相等性 因此,在您的示例中,基本上是说如果按下shift键(任意键+shift)

如果((a&b)==b)在以下代码块中是什么意思

if((e.Modifiers&Keys.Shift)=Keys.Shift)
{
lbl.Text+=“\n”+“按住Shift键。”;
}
为什么不是这样

if(e.Modifiers==Keys.Shift)
{
lbl.Text+=“\n”+“按住Shift键。”;
}
单个与(&)是位AND,因此它基本上是将(A&b)的值相加,然后测试(A&b)==b中的相等性

因此,在您的示例中,基本上是说如果按下shift键(任意键+shift)=shift

它是布尔逻辑(&=“按位and”)。检查变量是否包含值。它就像一个过滤器

例如:

a   -> 00110011
b   -> 00000011
a&b -> 00000011
在代码中

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

它检查键。移位包含在e.Modifiers中。

一个单独的符号和表示。当与带有
[Flags]
属性的枚举一起使用时(该属性由
枚举执行),它将如您所示用于确定是否设置了该枚举的某个位

可能会同时按下多个修改键,因此使用它而不是直接比较


您可以阅读有关枚举标志的更多信息。向下滚动到标题为“枚举类型作为位标志”的小节。您将看到一个与此非常类似的示例。

它使用逐位操作来查询是否设置了“标志”(位)(等于1)


&
处读取枚举和按位操作的最佳方法可能是按位and运算符。它所做的是
Keys
是一个标志枚举,
Keys
中的值可以是多个值的按位组合。因此,要测试任何特定的值,首先要将值与要测试的值进行比较,然后将其与要测试的值进行比较

例如,您可能同时按住shift键和ctrl键,因此
e.Modifier
中的值将是
键。shift
键。ctrl
的按位组合。因此:

e.Modifier == Keys.Shift
这是错误的。按住Shift键,同时按住Ctrl键。如果您想知道是否按住Shift键,而不考虑可能按住的其他键,则需要首先过滤掉所有其他键。这可以通过使用
键轻松完成。Shift
作为过滤器:

(e.Modifier & Keys.Shift) == Keys.Shift

如果按住shift键,则无论其他键可能被按下,否则为false。

第1部分

这是逻辑和运算符

当多个标志应可在一个中设置时使用,例如整数:

例如,3在二进制表示法中表示00000011。 例如,b是2,在二进制表示法中表示00000010

当您想检查a是否设置了b表示的标志(右起第二位),您可以使用AND运算符:

a&b=00000010

当这等于b(或大于0)时,您知道标志已设置

第二部分

如果您想检查“Keys.Shift”是否是唯一的“modifier”键,并且没有按下其他键,则也可以使用equal运算符。当您使用第一个代码时,也可以按下其他“修改器”键,并且if条件仍然为真。

单个与(&)执行位与运算;双符号与(&&)执行布尔与运算

按位and对两个参数的每一位执行and运算(因此称为“按位”)。因此,按位AND运算(或任何按位运算)的输出将不是布尔值。以下是一些按位AND操作的示例:

1001 & 0001 = 0001
1101 & 1111 = 1101
布尔AND对两个布尔值进行运算,并返回一个布尔值:

true && true = true
false && true = false
短路
还可以对返回布尔值的两个表达式执行布尔AND运算(&&&):

int a = 5;
int b = 10;
bool result = (a < 3) && (b > 3);
// result will be false;
inta=5;
int b=10;
bool结果=(a<3)和(b>3);
//结果将是错误的;
由于第一个表达式
(a<3)
的计算结果为
false
,因此结果不可能为
true
,因为两个表达式都必须计算结果为
true
。因此,甚至不会对第二个表达式求值。这被称为“短路”。但是,对于位AND运算,在执行该运算之前,需要对这两个表达式求值。因此,在大多数情况下,您只想确定两件事是否为真(布尔值),布尔值和(&&&)将是最佳选择

在您的示例中,代码将
e.Modifiers
中的各个位与
键.Shift
中的各个位进行比较。这两个参数都不表示布尔值,因此该操作是按位(&)而不是布尔(&&&)。

如果您看一下,这是带有
[FlagsAttribute]
属性的

仅当要对数值执行位运算(AND、OR、EXCLUSTIONAL 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 equal 111 & 001 = 001
这意味着:

 e.Modifiers & Keys.Shift == Keys.Shift
如果
e.Modifiers
不包含
键.Shift

e.Modifiers = Keys.Cancel | Keys.Enter (110)
因此,结果将是:

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

若要汇总,此条件将检查
e.Modifiers
是否包含
键。Shift
或not

Google
按位和
,然后Google
位标志
。可能的重复项不会添加它们!应用按位AND运算符和加法之间有很大的区别。是的,我意识到了这一点。我只是想用一种简单的方式解释一下。对不起,冒犯你了。
e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift)