運算子

算術運算子 Arithmetic operator

[運算子的優先順序]

Java 使用底下的標準數學運算規則來做為運算子優先順序的規則:

  • 有一對圓括弧的運算子
  • 遞增及遞減運算子
  • 乘法與除法運算子是由左而右做計算
  • 加法與減法運算子是由左而右做計算

[遞增與遞減]

  • Increment operator ++
  • Decrement operator --
前置與後置
  • 後置 :

    這行程式碼的其它運算都執行後才作遞增與遞減的動作。

    運算會在原來的數值被使用後才做遞增或遞減的動作

    • 後置遞增( Post-increment ) i++
    • 後置遞減( Post-decrement ) i--
public class UnaryOperatorDemo {
    public static void main(String[] args) {
        int age = 10;
        int var = age++;
        System.out.println(age);
        System.out.println(var);
        //此段程式與下列相同
        //int age = 10;
        //int var = age;
        //age = age + 1;
    }
}
//age=11
//var=10
// age 的值會先指定給 var,之後 age 才進行遞增的動作
  • 前置 :

    運算會在運算式執行之前就做遞增或遞減的動作

    • 前置遞增( Prefix-increment ) ++i
    • 前置遞減( Prefix-decrement ) --i
public class UnaryOperatorDemo2{
    public static void main(String[] args){
        int age = 10;
        int var = ++age;
        System.out.println(age);
        System.out.println(var);
        //此段程式與下列相同
        //int age = 10;
        //age = age + 1;
        //int var = age;
    }
}
//age=11
//var=11
//age 的值會先遞增,之後再指定給 var

[晉升&轉型的問題]

預設為int

  • 晉升( Promotion )

    晉升是編譯器將較小的資料型態升級為較大的資料型態

  • 轉型( Casting )

    將資料型態大的值指定給資料型態小的變轉型數,則您必須明確進行轉型(Casting)的動作

System.out.println(10 / 3); //3
System.out.println((double) 10 / 3); //3.3333...

關係運算子 Relational operator

用來比較兩個數值,並判定兩者之間的大小關係。

運算結果: boolean

狀況 運算子 範例
相等 == int i = 1 ;( i == 1 )
不等 != int i = 2 ;( i != 1 )
小於 < int i = 0 ;( i < 1 )
小於等於 <= int i = 2 ;( i <= 1 )
大於 > int i = 1 ;( i > 1 )
大於等於 >= int i = 1 ;( i >= 1 )

條件運算子 Conditional operator

讓您對兩個條件進行「並且」、「或」等判斷

運算結果: boolean

位元運算子( Bitwise operator )

又稱 邏輯運算子( Logical operator )

四個位元運算子

  • & : 將數值逐位元進行 And 運算
  • | : 將數值逐位元進行 Or 運算
  • ! : 將數值逐位元進行 Xor 運算
    • 兩個位元都為 0 或都為 1 時結果為 0,
    • 兩個位元非同時為 0 或同時為 1 時結果為 1
  • ~ : 取變數補數 ~op1

[&]

舉個例子來說,當 13 (1101)與 12 (1100)兩個數值進行&運算時,逐位元運算的結果會是 1100,也就是 12

13 12 end
1 1 1
1 1 1
0 0 0
1 0 0

[|]

13 12 end
1 1 1
1 1 1
0 0 0
1 0 1

13 12 end
1 1 0
1 1 0
0 0 0
1 0 1

[~]

補數運算子( Complement operator )

將數值的每一個位元都反相, 1 改為 0,0 改為 1

Java 中的正整數其二進位為 0 開始,以 1 開頭在 Java 中為負數

(32 位元長度)

int 13 : 00000000 00000000 00000000 00001101

~ 13 : 11111111 11111111 11111111 11110010

以 1 開頭在 Java 中為負數,運算後的值為-14。

計算法一:

位元值全為 1 在電腦中表示-1,
再減 1 就是-2,
11111111 11111111 11111111 11110010 
=> -1-13 為減去 13 後的值,
所以就是-14,

計算法一:取補數加 1

13 : 00000000 00000000 00000000 00001101
取補數加1 : 00000000 00000000 00000000 00001110

進位值表示為 14
因為1開頭為負數,所以這個數就是-14。

[範例]

public class BitwiseDemo{
    public static void main(String[] args){
        int i = 13;
        int j = 12;

        System.out.println("變數值...");
        System.out.println(" i = " + i);
        System.out.println(" j = " + j);

        System.out.println("位元運算...");
        System.out.println(" i & j = " + (i & j));
        System.out.println(" i | j = " + (i | j));
        System.out.println(" i ^ j = " + (i ^ j));
        System.out.println(" ~i = " + (~i));
    }
}
/*
變數值...
i = 13
j = 12
位元運算...
i & j = 12
i | j = 13
i ^ j = 1
~i = -14
*/

位移運算子 Shift operator

將指定數值的位元進行左移或右移,並可指定位移章節

  • 左移運算
  • 右移運算
運算子 操作 範例
<< op1 << op2 將 op1 的位元左移 op2 個單位,右邊補上 0
>> op1 >> op2 將 op1 的位元右移 op2 個單位,左邊補上原來最左邊的位元值
>>> op1 >>> op2 將 op1 的位元右移 op2 個單位,左邊補上 0
public class ShiftDemo{
    public static void main(String[] args){
        int i = 1;

        System.out.println("變數值...");
        System.out.println(" i = " + i);

        System.out.println("<< result");
        System.out.println(" i = " + i);
        System.out.println(" i << 1 = " + (i << 1));
        System.out.println(" i << 2 = " + (i << 2));
        System.out.println(" i << 3 = " + (i << 3));

        i = 8;
        System.out.println(">> result");
        System.out.println(" i = " + i);
        System.out.println(" i >> 1 = " + (i >> 1));
        System.out.println(" i >> 2 = " + (i >> 2));
        System.out.println(" i >> 3 = " + (i >> 3));

        i = 8;
        System.out.println(">>> result");
        System.out.println(" i = " + i);
        System.out.println(" i >>> 1 = " + (i >>> 1));
        System.out.println(" i >>> 2 = " + (i >>> 2));
        System.out.println(" i >>> 3 = " + (i >>> 3));
    }
}
/*
變數值...
i = 1 //0001

<< result
 i = 1
 i << 1 = 2 //0010
 i << 2 = 4 //0100
 i << 3 = 8 //1000

>> result
 i = 8 //1000
 i >> 1 = 4 //0100
 i >> 2 = 2 //0010
 i >> 3 = 1 //0001

>>> result
 i = 8
 i >>> 1 = 4 //0100
 i >>> 2 = 2 //0010
 i >>> 3 = 1 //0001
位移運算...
*/

results matching ""

    No results matching ""