Java中常用逻辑运算符 &&、 || 的底层实现

        在工作常常用到 & 和 | 进行逻辑运算,实则就是在给定的几个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。

猜你喜欢

转载自blog.csdn.net/m0_58907154/article/details/130559256