C#中单个与的第二个含义是什么?
我在C#中使用了单符号和(&)表示“检查第二个条件语句,即使第一个是假” 但以下似乎是C#中单个与的第二个含义是什么?,c#,linq,C#,Linq,我在C#中使用了单符号和(&)表示“检查第二个条件语句,即使第一个是假” 但以下似乎是&的不同含义,有人能解释一下i&1在下面的例子中是如何工作的吗 List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; var evenScores = scores.Where(i => i % 2 == 0); var evenScores2 = scores.Where(i => (i & 1)
&
的不同含义,有人能解释一下i&1
在下面的例子中是如何工作的吗
List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
var evenScores = scores.Where(i => i % 2 == 0);
var evenScores2 = scores.Where(i => (i & 1) == 0);
List分数=新列表{1,2,3,4,5,6,7,8};
var evenScores=分数。其中(i=>i%2==0);
var evenScores2=得分,其中(i=>(i&1)==0);
按位AND运算符。:
一元运算符
返回其操作数的地址(需要上下文)
二进制&运算符
是为整数类型和布尔预定义的。对于整数类型,&
计算其操作数的逻辑位和
。对于布尔操作数,和
计算其操作数的逻辑和
;也就是说,当且仅当其两个操作数都为真时,结果才为真
&运算符
计算两个运算符,而不考虑第一个运算符的值
对于布尔类型,您提到的是它的行为
对于整数类型,它是按位“and”运算符
它可以为其他类型重载
基本上,表达式(i&1)==0
检查是否设置了i
的最低有效位,这仅在数字为奇数时发生。与表示按位与运算。逐位运算符返回两个操作数中每个对应位之间的比较结果
例如,如果x是0110,y是1010,那么x和y的按位and(x&y)结果是0010。单&是“按位and运算符”,就像前面所说的那样。我在看问题的第二部分:“为什么它有效?”
以二进制方式思考:
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
and so on
注意所有偶数以0结尾;所以,如果最后一位按位检查1返回零(表示“不匹配”),则为偶数 前面的答案是正确的,但不要说明&
与&
有什么不同,我认为这是你最初的问题,所以我就回答这个问题
如前所述,和
是一个按位和<代码>&&
是逻辑AND&
对其操作数逐位执行AND运算,一般函数与+
或*
或任何算术运算符完全相同<代码>&更复杂。它将每个操作数与零进行比较。如果第一个操作数为零,它将假定值false
,并使表达式的其余部分短路,即不计算任何剩余的操作数。如果第一个值不为零,则检查第二个值。如果该值为零,则假定值为false
,否则假定值为true
。在这两种情况下,它都会继续计算表达式
也就是说,&
和&
之间有两个关键区别:
&
逐位操作,而&&
只考虑零和非零,始终返回0或1。因此5和6
(二进制101和110
)给出4(二进制100
),而5和&6
给出1(true
)&&
“短路”。如果第一个值为零,则不计算第二个值<代码>&没有这样的规则。这在以下几个方面很重要:
&
时,这些副作用总是会发生,而使用&
时,这些副作用不会发生。因此x&(y++)
将始终递增y
,而x&&(y++)
仅在x
不为零时递增y
。如果第二个操作数是函数调用,则这一点会变得更重要,也可能更微妙x=NULL&&x->foo==3
。使用&
,当x
为null
时,可能会出现段故障或类似故障x!='从数据库读取数据并计算总计(x)
。有了&
,不管怎样都会进行读取,这可能完全是浪费时间这就是为什么我们几乎总是将
&
用于真正的逻辑操作,并将&
的使用限制在真正需要位操作的时候。但有时您不希望发生短路,在这种情况下,&
可能是一个不错的选择。但是,如果要使用它进行“逻辑”运算,请非常小心那些可以有0或1以外的任何值的操作数1和&2
是true
,但是1和2
是false
如果你仔细想想那句话。。。这是低效的。我从这个问题中得到了,它指出了变量的速度更快。在C++中,你可以使用布尔值,因为BoL自动转换为零或一个(和后退)-一旦你优化了铸件,你就留下了与&但不进行短路评估的东西。(因此您可以保证正确的子表达式会产生副作用)。我想这适用于C#和Java,但不一定记得ATM。@Steve:根据OP的问题,他们已经知道这种行为是作为一种不短路布尔逻辑的方式存在的。@Jeff-但他不知道运算符是什么,所以不知道为什么它会起作用。只是试图将现有知识与新知识联系起来,澄清bool行为Edward知道不属于您解释的按位行为和boolint转换行为。感谢您实际解释它。注意,在C#中,&
运算符只能在两个bool
之间使用,因此询问第一个操作数是否为零毫无意义(在C#abool