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

时间:2013-02-16 00:43:23

标签: java methods arraylist boolean int

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

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

由于我已经为特定用户提供了很多帮助,我已经决定是时候纠缠SO社区了!我真的不明白这是如何工作的。调用该方法并将ArrayList的大小作为参数(即ArrayList有十个元素,数字= 10)。

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

我阅读它的方式是,如果number == 01 == 0,则返回true。我知道第一个不是真的,后者显然没有意义。有人可以帮帮我吗?

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

9 个答案:

答案 0 :(得分:111)

请记住“&”是一个按位操作。您可能已经意识到这一点,但根据您提出问题的方式,我并不完全清楚。

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

...10110110

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

因此,做一个按位&以上是1:

...10110110 & ...00000001

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

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

...10110111 & ...00000001

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

答案 1 :(得分:66)

你可以用二进制表示法确定最后一位的数字是偶数还是奇数:

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) == 0true,则表示number为偶数。


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

6 -> 00000000000000000000000000000110 (even)

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

1 -> 00000000000000000000000000000001

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

0 -> 00000000000000000000000000000000

以及number == 7

7 -> 00000000000000000000000000000111 (odd)

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

1 -> 00000000000000000000000000000001

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

1 -> 00000000000000000000000000000001

答案 2 :(得分:17)

&是按位AND运算符。 &&是逻辑AND运算符

在二进制中,如果数字位置位(即一个),则该数字为奇数。

在二进制中,如果位数为零,则数字为偶数。

(number & 1)是数字位的按位 AND测试。

另一种方法(可能效率更低但更易理解)是使用模数运算符%

private static boolean isEven(int number)
{
    if (number < 0)
       throw new ArgumentOutOfRangeException();

    return (number % 2) == 0;
}

答案 3 :(得分:8)

此表达式表示“整数表示偶数”。

原因如下:十进制1的二进制表示为00000000001。所有奇数都以二进制1结尾(这很容易验证:假设数字的二进制表示不以1结尾;那么它由非零幂2组成,这总是一个偶数)。当您使用奇数执行二进制AND时,结果为1;当您使用偶数执行二进制AND时,结果为0

这曾经是优化器很差到不存在时决定奇数/偶数返回的首选方法,%运算符需要&运算符所占周期数的20倍。现在,如果执行number % 2 == 0,编译器可能会生成与(number & 1) == 0一样快的代码。

答案 4 :(得分:5)

&表示逐位and运算符比较

因此,此代码检查是否设置了第一个bit(最不重要/最右),这表示该数​​字是否为odd;因为所有奇数都将在最低有效位中以1结尾,例如xxxxxxx1

答案 5 :(得分:4)

&是一种按位AND操作。

对于数字= 8:

  1000
  0001
& ----
  0000

结果是(8 & 1) == 0。这是所有偶数的情况,因为它们是2的倍数,右边的第一个二进制数字总是0. 1的二进制值为1,前导0,所以当我们AND时,它是偶数号码我们留下0。

答案 6 :(得分:3)

Java中的&运算符是按位运算符。基本上,(number & 1)执行按位 - 在number1之间执行。结果为0或1,具体取决于它是偶数还是奇数。然后将结果与0进行比较,以确定它是否均匀。

这是page describing bitwise operations

答案 7 :(得分:3)

它正在执行二进制且对1,如果未设置最低有效位,则返回0

为你的例子

00001010(10)

00000001(1)

===========

00000000(0)

答案 8 :(得分:3)

这是逻辑设计概念bitwise&amp; (AND)算子。

返回(2&amp; 1);表示 - 将值转换为按位数并将(AND)特征配合并返回值。

首选此链接http://www.roseindia.net/java/master-java/java-bitwise-and.shtml