On CodeReview我发布了一段工作代码,并询问了改进它的技巧。我得到的一个方法是使用布尔方法来检查ArrayList是否具有偶数个索引(这是必需的)。下面是我们建议的代码:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
因为我已经纠缠过那个特定的用户以获得很多帮助,所以我决定是时候纠缠SO社区了!我真的不太明白这是怎么回事。该方法被调用,并将ArrayList的大小作为参数(即ArrayList有10个元素,数量= 10)。
我知道只有一个&
同时运行数字和1的比较,但在那之后我就迷路了。
根据我的理解,它是说如果number == 0
和1 == 0
,则返回true。我知道第一个不是真的,而后者显然没有意义。有人能帮我吗?
编辑:我可能应该补充说,代码确实可以工作,以防有人想知道。
发布于 2013-02-16 08:49:17
请记住,"&“是一个按位运算。你可能已经意识到了这一点,但根据你提出问题的方式,我并不完全清楚。
也就是说,理论上的想法是你有一些int,它可以用一些1和0的序列以位的形式表示。例如:
...10110110
在二进制中,因为它是以2为基数的,所以每当数字的按位版本以0结束时,它就是偶数,当它以1结束时,它就是奇数。
因此,对上面的内容执行1的逐位&操作如下:
...10110110 & ...00000001
当然,这是0,所以您可以说原始输入是偶数。
或者,考虑一个奇数。例如,在上面的基础上加1。然后
...10110111 & ...00000001
等于1,因此不等于0。瞧。
发布于 2013-02-16 09:08:51
您可以通过二进制表示中的最后一位来确定数字是偶数还是奇数:
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
发布于 2013-02-16 08:45:00
&
是按位AND运算符。&&
是逻辑AND运算符
在二进制中,如果设置了数字位(即1),则该数字为奇数。
在二进制中,如果数字位为零,则数字为偶数。
(number & 1)
是对数字位的逐位AND测试。
另一种方法(可能效率较低,但更容易理解)是使用模运算符%
private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();
return (number % 2) == 0;
}
https://stackoverflow.com/questions/14905643
复制相似问题