这个布尔值“(数字和1)==0”是什么意思?

2022-08-31 12:33:55

关于代码审查我发布了一个工作代码,并询问了改进它的提示。我得到的一个是使用布尔方法来检查ArrayList是否具有偶数个索引(这是必需的)。这是建议的代码:

private static boolean isEven(int number)
{
    return (number & 1) == 0;
}

由于我已经缠着那个特定的用户寻求了很多帮助,所以我决定是时候纠缠SO社区了!我真的不明白这是怎么回事。调用该方法并将ArrayList的大小作为参数(即ArrayList有十个元素,数字= 10)。

我知道一个单运行数字和1的比较,但之后我迷失了。&

我读它的方式是说返回 true if 和 .我知道前者不是真的,后者显然没有意义。任何人都可以帮我吗?number == 01 == 0

编辑:我应该补充一点,代码确实有效,以防有人想知道。


答案 1

请记住,“&”是按位运算。你可能知道这一点,但根据你提出问题的方式,我并不完全清楚。

话虽如此,理论上的想法是你有一些int,它可以通过一些1和0的系列来表示。例如:

...10110110

在二进制中,因为它是以2为基数的,所以每当数字的按位版本以0结尾时,它都是偶数,当它以1结尾时,它是奇数。

因此,对上述内容进行按位和1是:

...10110110 & ...00000001

当然,这是0,所以你可以说原始输入是偶数。

或者,考虑一个奇数。例如,将 1 添加到我们上面的内容中。然后

...10110111 & ...00000001

等于 1,因此不等于零。瞧。


答案 2

您可以通过其二进制表示形式中的最后一位来确定数字是偶数还是奇数:

1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)

&两个整数之间是按位 AND 运算符:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

所以,如果 是 ,这个意思是偶数。(number & 1) == 0truenumber


让我们假设 ,然后:number == 6

6 -> 00000000000000000000000000000110 (even)

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1 -> 00000000000000000000000000000001

-------------------------------------

0 -> 00000000000000000000000000000000

当:number == 7

7 -> 00000000000000000000000000000111 (odd)

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1 -> 00000000000000000000000000000001

-------------------------------------

1 -> 00000000000000000000000000000001