Java基礎3:Java運算符及其原理分析

1. 自增自減運算符: ++ 和 --

 public static void main(String[] args) {

   int x=10,y =2;

   int result= y *++x;

   System.out.println("result = "+result);

   System.out.println("x = "+ x);

}

運行結果:

result = 22 ; x = 11

int result = y * x++;改成int result =y *++x;

運行結果: result = 20 ; x = 11

運行結果分析:

++x先執行x的自增操作,然後執行 y * x , 賦值給result;

x++ 先執行y*x , 賦值給result , 然後執行x的自增操作

關係運算符: > , <  , >= , <=,== , != , 返回結果 true 或者false


2. 三目運算符: 

public static void main(String[] args) {

   System.out.println('a'==97?"true":"false");

}

運行結果: true

3. 邏輯運算符: &&和|| , & 和 |

public static void main(String[] args) {

   int a=10;

   if (a > 100 && (a / 0) > 0) {

        System.out.println("執行了if");

   }else{

        System.out.println("執行了else");

   }

}

運行結果:

執行了else

if (a > 100 && (a / 0) > 0)修改爲if(a >100& (a/ 0) >0)

運行結果: Exception in thread "main"java.lang.ArithmeticException: / by zero

運行結果分析:

&&只要有一個返回false, 整個表達式返回false , 不需要執行後面的表達式 , &運算符會繼續執行下面的表達式。


4. 位運算:&(與) , |(或) , ~(非) , ^(異或) ,>>(右移) , <<(左移) , >>>(無符號右移) ,<<<(無符號左移 ,java中不存在)

    1. 與運算(num1 & num2):兩個二進制位都爲1 ,則返回1 ,否則返回0

    2. 或運算(num1 | num2):兩個二進制位都爲0 , 則返回0 ,否則返回1

    3. 異或運算(num1 ^ num2):兩個二進制位不同 ,則返回1 ,否則返回0

    4. 非運算(~num): num對應的二進制位爲1 , 則返回0 , 如果爲0 , 則返回1

    5.左移(num << value):二進制數字num向左移動value對應的位數 ,高位也就是符號位移出(捨棄) , 0補最低位。數字沒有溢出的前提下,左移一位都相當於乘以2,左移n位就相當於乘以2n

    6. 右移(num >> value):二進制數字num向右移動value對應的位數 ,符號位不變 , 如果num是負數,每一次右移都在左邊補1,如果num爲正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)。右移一位相當於除2,右移n位相當於除以2n

    7. 無符號右移(num >>> value):二進制數字num向右移動value對應的位數 ,符號位也就是最高位用0補位

    8. 無符號左移(num<<<value):java中沒有無符號左移的運算符 , 因爲左移運算符就是無符號左移

    9. 注意有以下幾種比較特殊的情況:

 - 如果移動的位數value超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33 % 32 = 1位。

 - 如果移動的位數value爲負數 ,  對於int類型java取的是位移的value最低五位的數值 , 也就是最大值位31 , 對於long型取得是位移的value最低6位的數值 ,也就是最大值是63 , 那麼編譯器會移動(該類型的最大位數 + value) 位。如對int型移動-2位,實際上移動了31 + (-2) + 1 = 30位

 - 正數右移到最後 , 結果爲0 , 負數右移到最後 , 結果爲-1(按補碼進行位移分析)

 - 位移之後 , 會將byte , short等範圍小的類型轉換爲int類型

public static void main(String[] args) {

   int num1=9,num2 =5;

   int result = num1 & num2;

   System.out.println("result = "+result);

}

運行結果 :

result = 1

int result = num1 & num2;修改爲int result = num1| num2;運行結果 : result = 13

int result = num1 & num2;修改爲int result = num1 ^ num2;運行結果 : result = 12

結果分析:

9 表示爲二進制是 00001001 (爲了清楚可見 , 忽略前面24個0)

5 表示爲二進制是 0000 0101 (爲了清楚可見 ,忽略前面24個0)


public static void main(String[] args) {

    int x = 16;

    int result = x << -31;

    System.out.println("result= "+ result);

}

運行結果: result = 32

結果分析: 左移 -31位相當於左移1位 , 就是乘以2

 

public static void main(String[] args) {

    int x = -16;

    int result = x >>>2;

    System.out.println("result= "+ result);

}

運行結果: result = 1073741820

結果分析:

  1. x轉換爲二進制位 10000000 00000000 00000000 00010000 ,
  2. 在計算機中保存的是補碼 11111111 11111111 11111111 1111 0000 ,
  3. 無符號右移2位之後的值爲 00111111 111111111111 1111 1111 1100
  4. 將其轉爲10進制 就是107374182
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章