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

Edw*_*uay 10 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) == 0);
Run Code Online (Sandbox Code Playgroud)

Rub*_*ias 33

单个&是"按位AND运算符",就像鸽子说的那样.我正在看问题的第二部分:"它为什么会起作用?"

想想二进制:

 000 = 0
 001 = 1
 010 = 2
 011 = 3
 100 = 4
 101 = 5
 110 = 6
 111 = 7
 and so on
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*lev 16

这里:

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

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

& operator评估板无论第一个的价值无论是运营商.


Jay*_*Jay 7

先前的答案是正确的,但没有解决&&的问题和不同,我认为这是你原来的问题,所以我会接受.

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

也就是说,&和&&之间存在两个重要区别:

  1. 并且一点一点地操作,而&&只考虑零和非零,并且总是返回0或1.因此,5和6(二进制101和110)给出4(二进制100),而5 && 6给出1(真).

  2. &&"短路".如果第一个值为零,则不计算第二个值.并且没有这样的规则.这在几个方面很重要.首先,如果第二个值有任何副作用,那么使用&那些副作用总会发生,而使用&&则不会.因此,"x&(y ++)"将始终递增y,而"x &&(y ++)"将仅在x不为零时递增y.如果第二个操作数是函数调用,这变得更加重要 - 并且可能更微妙.其次,第一个值可以测试确定第二个值无效的东西.比如"x!= NULL && x-> foo == 3".使用&,当x为null时,可能会引发段故障或等效事件.第三,可能会有重要的性能提升.生活,"x!='A'&& readTonsOfStuffFromDatabaseAndCalculateTotal(x)".使用&,无论如何都会发生读取,也许是浪费时间.

这就是为什么我们几乎总是使用&&来处理真正属于逻辑运算的事情,并且当我们真正想要一个按位操作时限制使用&.但有时你不希望发生短路,在这种情况下,可能是一个不错的选择.但是,如果您使用它来"逻辑"操作,请非常小心可以具有除0或1之外的任何值的操作数.1 && 2为真,但1和2为假.


Meh*_*ari 6

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

对于整数类型,它是按位"和"运算符.

它可以为其他类型重载.

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