我在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);
答案 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;:
&安培; &amp;&amp; amp;&amp;&amp;只考虑零和非零并且总是返回0或1。因此5&amp;图6(二进制101和110)给出4(二进制100),而5&amp;&amp; 6给出1(真)。
&安培;&安培; “短路”。如果第一个值为零,则不计算第二个值。 &安培;没有这样的规则。这在几个方面很重要。首先,如果第二个值有任何副作用,那么使用&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;,无论如何都会发生阅读,也许是浪费时间。
这就是为什么我们几乎总是使用&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运算符。