C#中单个&符号的第二个含义是什么?

时间:2009-10-08 13:11:55

标签: c# linq

我在C#中使用单个&符号来表示“检查第二个条件语句,即使第一个是 false ”。

但以下似乎完全是&不同含义,有人可以解释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);

6 个答案:

答案 0 :(得分:33)

单身&amp;是“按位AND运算符”,就像dove所说的那样。我正在看问题的第二部分:“它为什么会起作用?”

以二进制思考:

 000 = 0
 001 = 1
 010 = 2
 011 = 3
 100 = 4
 101 = 5
 110 = 6
 111 = 7
 and so on

注意所有偶数以0结尾;所以如果最后一位按1对1检查返回零(意思是“不匹配”),则为偶数;

答案 1 :(得分:16)

Here

  

一元& operator返回其操作数的地址(需要unsafe上下文)。

     

二进制& operators是为整数类型和bool预定义的。对于整数类型,&计算其操作数的逻辑按位AND。对于bool操作数,&计算其操作数的逻辑AND;也就是说,当且仅当两个操作数都为真时,结果才为真。

     

& operator评估两个运算符,而不管第一个运算符的值。

答案 2 :(得分:7)

之前的答案是正确的,但不解决&amp;不同于&amp;&amp;,我认为这是你原来的问题,所以我会接受。

如前所述,“&amp;”是一个按位AND。 “&安培;&安培;”是一个逻辑AND。 &安培;对其操作数逐位执行AND运算,一般函数与plus或times或任何算术运算符完全相同。 &安培;&安培;更复杂。如果将每个操作数与零进行比较。如果第一个操作数为零,则它假定值为FALSE并使表达式的其余部分短路,即它不评估任何剩余的操作数。如果第一个值不为零,则检查第二个值。如果为零,则假定值为false,否则假定值为true。在任何一种情况下,它都会继续评估表达式。

也就是说,&amp;和/或和&amp;&amp;:

  1. &安培; &amp;&amp; amp;&amp;&amp;只考虑零和非零并且总是返回0或1。因此5&amp;图6(二进制101和110)给出4(二进制100),而5&amp;&amp; 6给出1(真)。

  2. &安培;&安培; “短路”。如果第一个值为零,则不计算第二个值。 &安培;没有这样的规则。这在几个方面很重要。首先,如果第二个值有任何副作用,那么使用&amp;这些副作用总是会发生,而使用&amp;&amp;他们不。因此,“x&amp;(y ++)”将始终递增y,而“x&amp;&amp;(y ++)”将仅在x不为零时递增y。如果第二个操作数是函数调用,这变得更加重要 - 并且可能更微妙。其次,第一个值可以测试确定第二个值无效的东西。像“x!= NULL&amp;&amp; x-&gt; foo == 3”。使用&amp;,当x为null时,可以用段错误或等效物进行轰炸。第三,可能会有重要的性能提升。生命,“x!='A'&amp;&amp; readTonsOfStuffFromDatabaseAndCalculateTotal(x)”。使用&amp;,无论如何都会发生阅读,也许是浪费时间。

  3. 这就是为什么我们几乎总是使用&amp;&amp;对于那些真正合乎逻辑的操作,并限制使用&amp;当我们真正想要一个按位操作。但是有些时候你不希望发生短路,在那种情况下&amp;可能是个不错的选择。但是如果你使用它来“逻辑地”操作,那么要非常小心可以具有0或1以外的任何值的操作数.1&amp;&amp; 2是真的,但1&amp; 2是假的。

答案 3 :(得分:6)

对于布尔类型,您提到的是它的行为方式。

对于整数类型,它是按位“和”运算符。

它可以为其他类型重载。

基本上,表达式(i & 1) == 0检查是否设置了i的最低有效位,只有在数字为奇数时才会发生。

答案 4 :(得分:4)

&符号表示按位AND运算。按位运算符返回两个操作数中每个相应位之间的比较结果。

例如,如果x为0110且y为1010,则x和y(x&amp; y)的按位AND结果为0010。

答案 5 :(得分:3)

按位AND运算符。