java - 这个布尔“(数字&1)== 0”是什么意思?
在CodeReview上,我发布了一段代码,并询问了改进它的提示。 我得到的是使用布尔方法来检查ArrayList是否具有偶数个索引(这是必需的)。 这是建议的代码:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
由于我已经为那个特定用户提供了很多帮助,我已经决定是时候纠缠SO社区了! 我真的不明白这是如何工作的。 调用该方法并将ArrayList的大小作为参数(即ArrayList具有十个元素,数字= 10)。
我知道单个number == 0运行数字和1的比较,但之后我迷路了。
我读它的方式,就是说如果number == 0和1 == 0则返回true。我知道第一个不是真的,后者显然没有意义。 有人可以帮帮我吗?
编辑:我应该添加代码确实有效,万一有人想知道。
9个解决方案
110 votes
请记住“&” 是一个按位操作。 您可能已经意识到这一点,但根据您提出问题的方式,我并不完全清楚。
话虽这么说,理论上的想法是你有一些int,可以通过一些1和0的系列来表示。 例如:
...10110110
在二进制中,因为它是基数2,只要数字的按位版本以0结尾,它就是偶数,当它以1结尾时它是奇数。
因此,做一个按位& 以上为1是:
...10110110 & ...00000001
当然,这是0,所以你可以说原始输入是偶数。
或者,考虑一个奇数。 例如,将1添加到上面的内容中。 然后
...10110111 & ...00000001
等于1,因此不等于零。瞧。
Kirby answered 2019-05-12T05:15:23Z
65 votes
您可以通过其二进制表示中的最后一位确定偶数或奇数:
1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)
两个整数之间的number == 7是按位AND运算符:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
所以,如果number == 7是true,这意味着number是偶数。
让我们假设number == 7,然后:
6 -> 00000000000000000000000000000110 (even)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
0 -> 00000000000000000000000000000000
当number == 7:
7 -> 00000000000000000000000000000111 (odd)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
1 -> 00000000000000000000000000000001
Eng.Fouad answered 2019-05-12T05:16:19Z
17 votes
%是按位AND运算符。 &&是逻辑AND运算符
在二进制中,如果数位被设置(即一个),则该数字是奇数。
在二进制中,如果位数为零,则数字为偶数。
%是数字位的按位AND测试。
另一种方法(可能效率较低但更容易理解)是使用模数运算符%:
private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();
return (number % 2) == 0;
}
Mitch Wheat answered 2019-05-12T05:17:13Z
8 votes
该表达式表示“整数表示偶数”。
原因如下:十进制%的二进制表示形式为&.所有奇数以二进制结束于number % 2 == 0(这很容易验证:假设数字的二进制表示不以(number & 1) == 0结尾;那么它由非零幂组成 两个,总是一个偶数)。 当您使用奇数编号二进制AND时,结果为1; 当您使用偶数执行二进制AND时,结果为0。
这曾经是优化器很差到不存在时决定奇数/偶数返回的首选方法,并且%运算符需要二十三倍于&运算符所采用的周期数。 这些天,如果你做number % 2 == 0,编译器可能会生成与(number & 1) == 0一样快的代码。
dasblinkenlight answered 2019-05-12T05:17:58Z
5 votes
单bit表示按位odd运算符不比较
因此,此代码检查是否设置了第一个bit(最低有效/最右边),这表示该数字是否为odd; 因为所有奇数将在最低有效位中以1结束,例如xxxxxxx1
iTech answered 2019-05-12T05:18:35Z
4 votes
(8 & 1) == 0是一个按位AND操作。
对于数字= 8:
1000
0001
& ----
0000
结果是(8 & 1) == 0.这是所有偶数的情况,因为它们是2的倍数,右边的第一个二进制数字总是0. 1的二进制值为1,前导0,所以当我们AND时它 一个偶数,我们留下0。
Aram Kocharyan answered 2019-05-12T05:19:23Z
3 votes
Java中的&运算符是按位运算符。 基本上,(number & 1)执行按位 - 并在number和1之间。结果是0或1,具体取决于它是偶数还是奇数。 然后将结果与0进行比较以确定它是否为偶数。
这是一个描述按位运算的页面。
rgettman answered 2019-05-12T05:20:02Z
3 votes
它执行二进制且对1,如果未设置最低有效位,则返回0
为你的例子
00001010(10)
00000001(1)
===========
00000000(0)
Peter MacNaughton answered 2019-05-12T05:21:02Z
3 votes
这是逻辑设计概念按位;(AND)运算符。
返回(2和; 1); 表示 - 将值转换为按位数并比较(AND)功能并返回值。
喜欢这个链接[http://www.roseindia.net/java/master-java/java-bitwise-and.shtml]
Naveen AH answered 2019-05-12T05:21:47Z