在工作常常用到 & 和 | 进行逻辑运算,实则就是在给定的几个boolean布尔值结果,得到一个自己满足业务需求的Boolean结果。
例如:
boolean codeResult = checkCode("0717"); //返回true或者false
boolean passwordResult = checkCode("jkwang147.."); //返回true或者false
//业务要求需要两者都正确才允许登录
if(codeResult && passwordResult ){
//两者都为true
loginSuccess();
}
//此时产品经理说需求有改动,只要验证码(codeResult)和密码任意一个校验成功即可登录
if(codeResult || passwordResult ){
//一者为true即可进入
loginSuccess();
}
是吧,这种判断业务中随处可见吧。但是它是怎么实现的呢?
这就不得不提到计算机底层的二进制运算符了。
二进制运算
首先我们来学习下二机制,和它的运算符。计算机的底层其实就是0和1。我们的二进制就是用0或者1存储的数据。
比如我们现在有一个数值类型 17 想要存在计算机中。
17:
0001 0001
1:
0000 0001
5:
0000 0101
它就会以这种形式存储在内存中。每一个数字就是 1 bit 。
1bit = 1位 1字节 = 8bit 所以一字节只能存储 -128 ~ 127
这也是我们int类型存储到一定大小的数据会报错。因为int类型只有4字节。
好的,有些扯远了。回到我们常用的按位运算符。
常见的运算符有 !、&、 | 这三种 非、与、或
非常见的还有 ^ 、>> 、>>> 等
按位运算
何谓按位运算?其实非常好理解,实则就是将两个数值的二进制数据拿出来,每个位对每个位的运算。
1、^ 异或运算
按位不同则为1,相同则为0 。这样记会比较吃力。我们把^当作一个笑脸的眼睛。1是男生,0是女生。什么时候会笑啊就是男生见到女生就会笑。所以如果配对是一男一女他就开心就是1。如果匹配是同性则为0;我们来做下 下面的计算把。
计算:2^5
2的二进制:0010
5的二进制:0101
计算结果: 0111 还原二进制结果为:7
2、| 或运算
| 有1则1 如果两个都是0为0。也可以把 | 当作寻找男生。按位中如果有男生则是1
计算:2 | 5
2的二进制:0010
5的二进制:0101
计算结果: 0111 还原二进制结果为:7
和异或结果一样,但是是纯属巧合,这两个运算没有关联。
3、& 与运算
& 只有按位两位都是1才是1 否则全是0。&你看它样子就很扭曲,你可以看成畸形的爱吧。只有楠楠它才为1。
计算:2 & 5
2的二进制:0010
5的二进制:0101
计算结果: 0000 还原二进制结果为:0
4、! 非运算
该运算符不是两个二进制的运算符。它通常对一个二进制进行取反。比如:0000 变成 1111.
1则为0 , 0则为1
Java逻辑运算符 & 和 |
在这之前要讲一下boolean类型。因为我们逻辑运算符与 或 通常是搭配布尔值类型来使用的。而我们的布尔值 boolean 底层实际也就是两个数值。0和1
0是false
1是true
所以我们代码中常见的 if(boolean a & boolean b) if(boolean a | boolean b) 实则底层就是 0与1的按位运算
boolean t = true;
boolean f = false;
if(t & f){
实则是:0001
&
0000
---------------------
结果:0000
返回的是0 所以是flase
}
if(t | f){
实则是:0001
|
0000
---------------------
结果:0001
返回的是1 所以是true
}
那为什Java中变成 && 和 || 。单个的是按位判断。双个的是逻辑判断。
Java为了节省效率。不必操作一些不必要的操作。所以封装了逻辑与&&、或||。
比如我这边 && 逻辑与。我们明知道是要判断两个都是true才是true。但是我一个的boolean值就是flase就没有必要。去和第二个boolean值进行计算了。
|| :逻辑或 也是。当我们第一boolean值就是true。第二个boolean值是不是true已经没关系了。反正返回的都是true。