在以下代码中:
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
...... (i & 1) == 1
是什么意思?
答案 0 :(得分:12)
Bitwise AND。在这种情况下,检查i
中的最后一位是否已设置。如果是,则它必须是奇数,因为最后一位代表1而所有其他位代表偶数。
答案 1 :(得分:4)
'&安培;'是bitwise and operator。 &amp;'with 1消除所有其他二进制数字,如果数字是偶数则保留0,如果是奇数则保留1。
这是黑客的做法。数学家当然会使用modulo 2 arithmetic来写((i%2)== 1)!软件工程师会编写!IsEven(i),重用库函数并获得重用布朗尼点......: - )
现在,这些是否更有效取决于编译器和CLR - 在这种情况下,还取决于谁来处理LINQ表达式树,以及接收者准备处理什么。
答案 2 :(得分:4)
&安培;是一个按位AND运算符,AND是二进制系统中的基本运算之一。
AND表示'如果A和B都打开'。现实世界的例子是两个串联的开关。只有当两者都允许电流通过时,电流才会通过。
在计算机中,这些不是物理开关,而是半导体,它们的功能称为logic gates。它们与开关做同样的事情 - 对电流或无电流做出反应。
当应用于整数时,一个数字中的每个位与另一个数字中的每个位组合。因此,要理解按位运算符AND,需要将数字转换为二进制,然后对每对匹配位执行AND运算。
这就是为什么:
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
尽管
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
因此,(&amp; 1)操作使用AND逻辑将最右边的位与1进行比较。所有其他位都被有效忽略,因为任何东西都没有任何东西。
这相当于检查数字是否为奇数(所有奇数的最右位都等于1)。
以上内容改编自我写给this question的类似答案。
答案 3 :(得分:2)
即检查最后一位是否打开(这使得它变为奇数)。请注意,这不是专门针对linq的,您可以在sql或c#代码上执行此操作。