JAVA中的逻辑运算(短路原则)与位运算

短路原则

  • JAVA 中的逻辑运算符
    图来自菜鸟教程
    在这里插入图片描述

  • 短路原则
    即是在Java中如果执行该逻辑判断时能够判断整条语句的正确了那就不执行后面的语句了

		int index=5;
		System.out.println((5==5)||(++index==5));
		System.out.println(index);
		System.out.println((5==6)&&(++index==6));
		System.out.println(index);

输出:
在这里插入图片描述

位运算

    二元操作符:
        左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位异或( ^ )
    一元运算符:
        位非( ~ )

二元运算符即是左右两边都要有  变量(已赋值)/常量

  • 左移(<<)

    • Java中整数默认是int型(默认是指如System.out.print(3);这种未定义类型),所以占4个字节,有32位

    3<<2

    即是指将3转为二进制:

    0000 0000 0000 0000 0000 0000 0000 0011

    11后左移两位即是1100

    0000 0000 0000 0000 0000 0000 0000 1100

    转化为十进制为12,(常常感觉就是乘了2的几次方)

  • 右移(<<)

    • 与左移不同的是右移是高位补零

    所以如果是7<<2的话,7的二进制是

    0000 0000 0000 0000 0000 0000 0000 0111

    右移两位(高位补零):

    0000 0000 0000 0000 0000 0000 0000 0001

    即为1

  • 无符号右移(>>>)

      在我们的计算机中,机器数的二进制序列中,最高位代表的是正负,0则正,1则负
    
      所以对于int型,其占有四个字节,32位,所以其大小范围为[-2^31^,2^31^-1]
    

    在此先来回顾一下我们学到的原码,反码,补码

      正数的原,反,补是一样的,下面只说负数
    
    • 原码

      负数的原码:如-7,在一个字节表示下为

      1000 0111

    • 反码

      反码是在原码的基础上符号位不变,其余位取反

      即在一个字节表示下,-7的反码为:

      1111 1000

    • 反码

      反码是在补码的基础上加1

      即在一个字节表示下,-7的补码为:

      1111 1001

    • 所以无符号右移(>>>)是什么意思呢?

      从无符号上即可以认为该主要针对负数,对于正数无符号与有符号右移是一样的,而负数就不一样了。

      例如在Java中,将-5(默认为int型)转换为二进制为:

      1111 1111 1111 1111 1111 1111 1111 1011

      	System.out.println(Integer.toBinaryString(-5));
      

      输出:
      补码

      • 怎么来的?

      负数在计算机中是以补码的形式存储的

      得到了-5在计算中的二进制码之后,无符号后移三位即是,前面补“0”,所以-5>>>3

      即得到二进制序列为:

      0001 1111 1111 1111 1111 1111 1111 1111

      转为十进制为:536870911

      System.out.println(Integer.toBinaryString(-5));
      System.out.println(Integer.toBinaryString(-5>>>3));
      System.out.println(-5>>>3);
      System.out.println(-5>>3);
      

      输出:
      输出

  • 位与(&)

    运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
    即是离散数学中同为真才为真

    不多说,上实测例子:

    	System.out.printf("-1的二进制码为:%s%n",Integer.toBinaryString(-1));
    	System.out.printf("9的二进制码为:%s%n",Integer.toBinaryString(9));
    	System.out.printf("12的二进制码为:%s%n",Integer.toBinaryString(12));
    	System.out.println("9&-1的值为"+(9&-1));
    	System.out.println("9&12的值为"+(9&12));
    	System.out.println("9&0的值为"+(9&0));
    	System.out.println("9&1的值为"+(9&1));
    

    输出:
    在这里插入图片描述

同理其他三个也是一样,这里就不一一说明了,结合布尔运算就很好记住了

  • 位或( | )

有“ 1”得“1”

  • 位移或( ^ )

不同为“1”

  • 位非( ~ )

取反就是

测试
System.out.println(~9==(-10));//输出true

位运算符的组合

如:&= 按位与赋值

|= 按位或赋值

^= 按位非赋值

>>= 右移赋值

>>>= 无符号右移赋值

<<= 赋值左移

本文可参考链接:

  1. 强推菜鸟这篇时常复习
  2. https://blog.csdn.net/xiaochunyong/article/details/7748713
  3. https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
  4. http://ceeji.net/blog/mod-in-real/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章