5

在以下代码中:

Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;

... 是什么意思(i & 1) == 1

4

4 回答 4

12

按位与。在这种情况下,检查是否i设置了最后一位。如果是,则它必须是奇数,因为最后一位表示 1,所有其他位表示偶数。

于 2009-03-15T09:14:05.320 回答
4

'&' 是按位和运算符。&'ing with 1 消除所有其他二进制数字,如果数字是偶数,则留下 0,如果是奇数,则留下 1。

这是黑客的做法。数学家当然会写 ((i % 2) == 1) 代替,使用模 2 算术!而软件工程师会编写!IsEven(i),重用库函数并获得重用布朗尼积分...... :-)

现在,这些是否更有效取决于编译器和 CLR——在这种情况下,还取决于谁来处理 LINQ 表达式树,以及接收者准备处理什么。

于 2009-03-15T09:13:38.893 回答
4

& 是位与运算符,与是二进制系统中的基本运算之一。

AND 表示“如果 A 和 B 都打开”。现实世界的例子是两个串联的开关。只有当两者都允许电流通过时,电流才会通过。

在计算机中,这些不是物理开关而是半导体,它们的功能被称为逻辑门。它们做与开关相同的事情——对电流或无电流作出反应。

当应用于整数时,一个数字中的每一位都与另一个数字中的每一位相结合。因此,要理解位运算符 AND,您需要将数字转换为二进制,然后对每对匹配的位进行 AND 运算。

因此:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

然而

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

因此,(& 1) 操作使用 AND 逻辑将最右边的位与 1 进行比较。所有其他位都被有效地忽略了,因为任何东西都不是什么。

这相当于检查数字是否为奇数(所有奇数的最右边位等于 1)。

以上内容改编自我写给这个问题的类似答案。

于 2009-03-15T12:25:55.950 回答
2

那是检查最后一位是否打开(这很奇怪)。请注意,这不是专门针对 linq 的,您可以在 sql 或 c# 代码上执行此操作。

于 2009-03-15T09:13:23.183 回答