java 0-1等于多少_java - 这个布尔“(数字&1)== 0”是什么意思?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值