这是什么布尔“(数字&1)== 0”是什么意思?
在CodeReview上,我发布了一段代码,并要求提供改进的提示。 我得到的是使用布尔方法来检查一个ArrayList是否有偶数个索引(这是必需的)。 这是build议的代码:
private static boolean isEven(int number) { return (number & 1) == 0; }
由于我已经向那个特定的用户求助了很多帮助,所以我决定是时候纠缠这个SO社区了! 我真的不明白这是如何工作的。 该方法被调用并将ArrayList的大小作为参数(即ArrayList有十个元素,数字= 10)。
我知道一个人运行数字和1的比较,但之后我迷路了。
我读它的方式,它是说如果number == 0
和1 == 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) == 0
是true
,这意味着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)
执行一个按位, number
和1
之间。 结果是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