Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是什么意思?;操作人员_C#_.net_Linq_Operators - Fatal编程技术网

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()。