What does this boolean "(number & 1) == 0" mean?

On CodeReview I posted a working piece of code and asked for tips to improve it. One I got was to use a boolean method to check if an ArrayList had an even number of indices (which was required). This was the code that was suggested:

private static boolean isEven(int number)
{
return (number & 1) == 0;
}

As I've already pestered that particular user for a lot of help, I've decided it's time I pestered the SO community! I don't really understand how this works. The method is called and takes the size of the ArrayList as a parameter (i.e. ArrayList has ten elements, number = 10).

I know a single & runs the comparison of both number and 1, but I got lost after that.

The way I read it, it is saying return true if number == 0 and 1 == 0. I know the first isn't true and the latter obviously doesn't make sense. Could anybody help me out?

Edit: I should probably add that the code does work, in case anyone is wondering.

22254 次浏览

&是位 AND 运算符。 &&是逻辑 AND 运算符

在二进制中,如果数字位被设置(即一) ,则数字为奇数。

在二进制中,如果数字位为零,则数字为偶数。

(number & 1)是数字位的 按位计算与测试。

另一种方法是使用模运算符 %:

private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();


return (number % 2) == 0;
}

这个表达式的意思是“整数表示偶数”。

原因如下: 十进制 1的二进制表示是 00000000001。所有奇数都以二进制的 1结尾(这很容易验证: 假设该数的二进制表示不以 1结尾; 然后它由二的非零幂组成,二的非零幂总是偶数)。当使用奇数执行二进制 AND时,结果是 1; 当使用偶数执行二进制 AND时,结果是 0

在优化器差到几乎不存在的时候,这曾经是判断奇偶的首选方法,而 %操作符需要的周期数是 &操作符的20倍。现在,如果您使用 number % 2 == 0,编译器很可能会生成执行速度与 (number & 1) == 0相同的代码。

单个 &意味着按位 and操作符 没有比较

因此这段代码检查第一个 bit(最小有效位/最右边)是否设置,这表明数字是否为 odd; 因为所有奇数都以最小有效位 1结束,例如 xxxxxxx1

Java 中的 &运算符是位和运算符。基本上,(number & 1)执行一个位-和之间的 number1。结果是0还是1,取决于它是偶数还是奇数。然后将结果与0进行比较,以确定它是否为偶数。

这是 描述按位操作的页

它正在执行一个二进制文件,对象是1,如果没有设置最低有效位,则返回0

以你为例

00001010(10)

0000001(1)

===========

0000000(0)

记住“ &”是一个位操作。你可能已经意识到了这一点,但是从你提出问题的方式来看,我并不完全清楚。

也就是说,理论上的想法是,你有一些 int,它可以用一些1和0的序列来表示。例如:

...10110110

在二进制中,因为它是以2为基数,所以每当数字的位版本以0结尾时,它是偶数,而当它以1结尾时,它是奇数。

因此,对上面的代码按位 & 使用1是:

...10110110 & ...00000001

当然,这是0,所以可以说原始输入是偶数。

或者,考虑一个奇数。例如,在上面的基础上加1。然后

...10110111 & ...00000001

等于1,因此不等于0。

&是按位的 AND操作。

数字 = 8:

  1000
0001
& ----
0000

结果是 (8 & 1) == 0。所有偶数都是这种情况,因为它们是2的倍数,右边第一个二进制数总是0。1的二进制值为1,前面带有0,所以当我们用偶数表示 AND时,我们留下0。

你可以通过 最后一点的二进制表示来确定这个数字是偶数还是奇数:

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) == 0true,这意味着 number是偶数。


那么,让我们假设 number == 6:

6 -> 00000000000000000000000000000110 (even)


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


1 -> 00000000000000000000000000000001


-------------------------------------


0 -> 00000000000000000000000000000000

number == 7:

7 -> 00000000000000000000000000000111 (odd)


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


1 -> 00000000000000000000000000000001


-------------------------------------


1 -> 00000000000000000000000000000001

这是逻辑设计概念按位 & (AND)运算符。

Means-将值转换为按位数并比较(AND)特性,然后返回值。

喜欢这个链接 http://www.roseindia.net/java/master-java/java-bitwise-and.shtml