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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章