关于"逻辑运算符"中的&和|的误区
昨晚有同学问我&和|的结果应该是true和false.但为什么能连接两个数值?
int i = 5 & 12;
System.out.println(i);
int j = 5 | 12;
System.out.println(j);
如上就是我学生遇到的问题.
在此说明下,此处的&和|并不是所谓的逻辑运算符,而是二进制运算符中的按位与和按位或.何解?
二进制与运算符(&):两个二进制数像十进制加法一样右对齐,上下都为1结果为1,只要有一个0结果为0,当然上下两个数对应位都为0的话结果也为0.
我们都知道int类型是32位二进制掩码,下面我为了方便,只保留低八位演示讲解:
5的二进制是:00000101
12的二进制是:00001100
00000101
& 00001100
-------------------
00000100
大家注意,二进制的运算一定保证右对齐,通过上面说明都为1结果为1,按位与运算之后为00000100,这个结果就是4了.
二进制中的按位或运算符(|):首先将十进制数转换成二进制数,两个二进制数值右对齐,上下只要有一个1,结果为1,上下都为0结果为0.
00000101
| 00001100
------------------
00001101
通过上面的或运算,运算结果为00001101即13.
通过上面的介绍,相信大家应该了解了,当&作为二元运算符,左右两边都是数字时,并不是我们所谓的逻辑与运算符,而是二进制运算符中的按位与,同理当|作为二元运算符,左右两边都是数字时也不是所谓的逻辑或,而是二进制运算符按位或.
当然,如果"&“和”|“左右两边是boolean值或者是判断表达式(用关系运算符连接的表达式,本质是boolean值)的话,那么”&“表示逻辑与,”|"表示逻辑或.
在此,引入下百度查到的运算符的优先级:
在这里提醒小伙伴注意,逻辑与(&)优先级大于逻辑或(|)优先级大于短路与(&&)优先级大于短路或(||).
为了方便大家记忆,大家可以简要记住与大于或,逻辑的大于短路的.
上面代码希望对大家有所帮助.