C# 这是什么意思?;操作人员
在以下代码中:C# 这是什么意思?;操作人员,c#,.net,linq,operators,C#,.net,Linq,Operators,在以下代码中: Expression<Func<int, bool>> isOdd = i => (i & 1) == 1; 表达式isOdd=i=>(i&1)==1; “(i&1)=1”的含义是什么?它检查最后一位是否为on(这使它变为奇数)。请注意,这并不是专门针对linq的,您可以在sql或c#code上执行。“&”是使用1进行运算将消除所有其他二进制数字,如果该数字为偶数,则保留0;如果该数字为奇数,则保留1 这是黑客的做法。一个数学家当然会写(
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
表达式isOdd=i=>(i&1)==1;
“
(i&1)=1
”的含义是什么?它检查最后一位是否为on(这使它变为奇数)。请注意,这并不是专门针对linq的,您可以在sql或c#code上执行。“&”是使用1进行运算将消除所有其他二进制数字,如果该数字为偶数,则保留0;如果该数字为奇数,则保留1
这是黑客的做法。一个数学家当然会写((i%2)==1),而不是使用!而软件工程师会写!IsEven(i),重用库函数并获得重用布朗尼点数…:-)
现在,这些是否更有效取决于编译器和CLR——在本例中,还取决于谁来处理LINQ表达式树,以及接收者准备处理什么 。在这种情况下,检查是否设置了
i
中的最后一位。如果是,则必须是奇数,因为最后一位表示1,所有其他位表示偶数。&是按位and运算符,是二进制中的基本运算之一
表示“如果A和B都打开”。现实世界的例子是两个串联的开关。只有当两者都允许电流通过时,电流才会通过
在计算机中,这些不是物理开关,而是半导体,它们的功能称为。它们和开关做同样的事情——对电流或无电流作出反应
当应用于整数时,一个数字中的每一位都与另一个数字中的每一位相结合。因此,要理解逐位运算符和,需要将数字转换为二进制,然后对每对匹配位执行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)
以上内容是根据我写给的类似答案改编而成。我相信&操作在技术上是最有效的。不要太确定。编译器和IL JIT执行器拥有比您想象的更大的自由度……一个碰巧喜欢使用扩展方法实现清晰简洁的C#的软件工程师可能会编写i.IsNotEven()。