And*_*tin 76 java methods int boolean arraylist
在CodeReview上,我发布了一段代码,并询问了改进它的提示.我得到的是使用布尔方法来检查ArrayList是否具有偶数个索引(这是必需的).这是建议的代码:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
Run Code Online (Sandbox Code Playgroud)
由于我已经为那个特定的用户提供了很多帮助,我已经决定是时候纠缠SO社区了!我真的不明白这是如何工作的.调用该方法并将ArrayList的大小作为参数(即ArrayList具有十个元素,数字= 10).
我知道一个单独&运行数字和1的比较,但在那之后我迷路了.
我读它的方式,就是说,如果number == 0和,则返回true 1 == 0.我知道第一个不是真的,后者显然没有意义.有人可以帮帮我吗?
编辑:我应该添加代码确实有效,万一有人想知道.
Kir*_*rby 112
请记住,"&"是一种按位操作.您可能已经意识到这一点,但根据您提出问题的方式,我并不完全清楚.
话虽这么说,理论上的想法是你有一些int,可以通过一些1和0的系列来表示.例如:
...10110110
Run Code Online (Sandbox Code Playgroud)
在二进制中,因为它是基数2,只要数字的按位版本以0结尾,它就是偶数,当它以1结尾时它是奇数.
因此,对于上述内容执行按位和1是:
...10110110 & ...00000001
Run Code Online (Sandbox Code Playgroud)
当然,这是0,所以你可以说原始输入是偶数.
或者,考虑一个奇数.例如,将1添加到上面的内容中.然后
...10110111 & ...00000001
Run Code Online (Sandbox Code Playgroud)
等于1,因此不等于零.瞧.
Eng*_*uad 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)
Run Code Online (Sandbox Code Playgroud)
& 两个整数之间是按位AND运算符:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Run Code Online (Sandbox Code Playgroud)
所以,如果(number & 1) == 0是true,这意味着number是均匀的.
我们假设那样number == 6:
6 -> 00000000000000000000000000000110 (even)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
0 -> 00000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
何时number == 7:
7 -> 00000000000000000000000000000111 (odd)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
1 -> 00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)
Mit*_*eat 17
&是按位AND运算符.&&是逻辑AND运算符
在二进制中,如果设置了数位(即一位),则该数字为奇数.
在二进制中,如果位数为零,则数字为偶数.
(number & 1) 是位数的按位 AND测试.
另一种方法(使用效率可能更低但更易理解)是使用模数运算符%:
private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();
return (number % 2) == 0;
}
Run Code Online (Sandbox Code Playgroud)
该表达式表示"整数表示偶数".
原因如下:十进制的二进制表示1是00000000001.所有奇数都1以二进制结尾(这很容易验证:假设数字的二进制表示没有结束1;那么它由2的非零幂组成,它总是偶数).当你AND用奇数做二进制时,结果是1; 当你AND用偶数做二进制时,结果是0.
这曾经是优化器很差到不存在时决定奇数/偶数返回的首选方法,并且%运算符需要运算符所占周期数的20倍&.现在,如果这样做number % 2 == 0,编译器可能会生成尽快执行的代码(number & 1) == 0.
单一&意味着逐位and运算符而不是比较
因此,此代码检查是否设置了第一个bit(最不重要/最右),这表示该数字是否是odd; 因为所有奇数都将以1最低有效位结束,例如xxxxxxx1