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

在CodeReview上,我发布了一段代码,并要求提供改进的提示。 我得到的是使用布尔方法来检查一个ArrayList是否有偶数个索引(这是必需的)。 这是build议的代码:

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

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

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

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

编辑:我应该补充说,代码的工作,以防万一有人想知道。

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

也就是说,理论上的思想是你有一些int,可以用一系列的1和0来表示。 例如:

 ...10110110 

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

所以,对于上面的做1和1是:

 ...10110110 & ...00000001 

当然,这是0,所以你可以说原来的input是偶数。

或者,考虑一个奇数。 例如,给我们上面添加1。 然后

 ...10110111 & ...00000001 

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

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

 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 

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

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

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

(number & 1)是数字位的按位 ANDtesting。

另一种方法来做到这一点(可能效率较低但更容易理解)是使用模数运算符%

 private static boolean isEven(int number) { if (number < 0) throw new ArgumentOutOfRangeException(); return (number % 2) == 0; } 

这个expression的意思是“整数代表一个偶数”。

这是为什么:小数1的二进制表示是00000000001 。 所有的奇数都以1为二进制结尾(这很容易validation:假设数字的二进制表示不是以1结尾;那么它是由2的非零幂组成的,它总是偶数)。 当你做一个奇数的二进制数时,结果是1 ; 当你做一个二进制AND一个偶数时,结果是0

在优化器不存在的时候,这是用来决定奇数/偶数的首选方法, %运算符要求运算符的二十倍。 现在,如果你number % 2 == 0 ,那么编译器很可能会生成与(number & 1) == 0一样快的代码。

单位&意味着比特明智and运营商没有比较

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

&是一个按位AND操作。

对于数字= 8:

  1000 0001 & ---- 0000 

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

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

这是一个描述按位操作的页面 。

它正在执行一个二进制和1,如果最低有效位没有设置,则返回0

为你举例

00001010(10)

00000001(1)

===========

00000000(0)

这是逻辑devise概念按位与(AND)操作符。

返回(2&1); 意味着将该值转换为按位数,并将(AND)特征值转换并返回该值。

喜欢这个链接http://www.roseindia.net/java/master-java/java-bitwise-and.shtml