int int.operator(int left, int right) &

5
我尝试理解这个表达式:
 static Func<int, bool> isOdd = i => (i & 1) == 1;

但这意味着什么?

例如,我有i=3。那么(3&1)==1

或者i=4。那么(4&1)==1

我不理解这个。它怎么确定它是奇数还是偶数。

使用这种方法:

public static void Hallo2()
        {
            for (int i = 0; i < 10; i++)
            {
                if (isOdd(i))
                    Console.WriteLine(i + " is odd");
                else
                    Console.WriteLine(i + " is even");
            }

        }

谢谢您


1
Hint: What does & mean? - tadman
{btsdaf} - DK.
{btsdaf} - LikeToDo
2
& 是按位与,不是或。您可以通过搜索 "c# 运算符" 轻松找到它。 - Mat
好的。谢谢。所以如果i是奇数且1是奇数,那么表达式就是奇数? - LikeToDo
@LikeToDo - 不完全是这样,更像是如果 i & 11 并且 11,那么表达式就是奇数。 - Enigmativity
3个回答

6

& 是按位与运算。.net使用32位整数,但本例中只用4位,其中左边的位为最不重要的位。

操作3 & 1. 将两个数字转换为二进制数,即0011和0001,并输出两数公共部分的结果。1000=1。

4 & 1是0100和0001,所以0000=0

基本上,该运算是检查第一个(或最不重要的)位是否为1,如果是,则知道该数字是奇数。


啊,好的。谢谢。 - LikeToDo
3
3表示为0011,4表示为0100,1表示为0001,以澄清意思。 - Deolus

4
尝试将其转换为位,以便您可以可视化它: 3 = 0011,而1 = 0001。因此,0011&0001将导致0001。 如果您执行3&2 == 2,您也会得到true,因为0011&0010将导致0010。 类似地,8和2 == 2将导致false,因为8是0100,而2是0010,因此按位与的结果将是0000。

1
你将逻辑运算符与二进制和位运算符混淆了。

或者i = 4。然后(4 & 1) == 1

这是不正确的,因为4的二进制格式是0b100,当你以二进制计算时,你会得到0b100 & 0b001 == 0; 对于3 & 1同样适用,结果为0b11 & 0b01 == 1。因此该方法按预期工作。由于所有奇数总是最低有效位设置为1,这是测试数字是否为奇数的最快和最简单的方法。对于偶数则相反。

1
我认为“最简单”的定义是有争议的。对我来说,像 X % 2 这样使用 % 运算符似乎更直观,因此检查奇偶性更简单。& 运算符可能是最好的选择,即使不太直观。只需要几分钟就可以理解。 - lenny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接