運算子
算術運算子 Arithmetic operator
[運算子的優先順序]
Java 使用底下的標準數學運算規則來做為運算子優先順序的規則:
- 有一對圓括弧的運算子
- 遞增及遞減運算子
- 乘法與除法運算子是由左而右做計算
- 加法與減法運算子是由左而右做計算
[遞增與遞減]
- Increment operator
++
- Decrement operator
--
前置與後置
後置 :
這行程式碼的其它運算都執行後才作遞增與遞減的動作。
運算會在原來的數值被使用後才做遞增或遞減的動作
- 後置遞增( Post-increment )
i++
- 後置遞減( Post-decrement )
i--
- 後置遞增( Post-increment )
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
- 前置遞增( Prefix-increment )
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
位移運算...
*/