On CodeReview我发布了一段代码,并询问了改进它的提示。我得到的是使用布尔方法来检查ArrayList是否具有偶数个索引(这是必需的)。这是建议的代码:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
由于我已经为特定用户提供了很多帮助,我已经决定是时候纠缠SO社区了!我真的不明白这是如何工作的。调用该方法并将ArrayList的大小作为参数(即ArrayList有十个元素,数字= 10)。
我知道单个&
运行数字和1的比较,但之后我迷路了。
我阅读它的方式是,如果number == 0
和1 == 0
,则返回true。我知道第一个不是真的,后者显然没有意义。有人可以帮帮我吗?
编辑:我应该补充说代码确实有效,万一有人想知道。
答案 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) == 0
为true
,则表示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)
执行按位 - 在number
和1
之间执行。结果为0或1,具体取决于它是偶数还是奇数。然后将结果与0进行比较,以确定它是否均匀。
答案 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