在以下代码中:
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
... 是什么意思(i & 1) == 1
?
按位与。在这种情况下,检查是否i
设置了最后一位。如果是,则它必须是奇数,因为最后一位表示 1,所有其他位表示偶数。
& 是位与运算符,与是二进制系统中的基本运算之一。
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)。
以上内容改编自我写给这个问题的类似答案。
那是检查最后一位是否打开(这很奇怪)。请注意,这不是专门针对 linq 的,您可以在 sql 或 c# 代码上执行此操作。