Java :: 運算子
文章推薦指數: 80 %
位元運算
OPENHOME.CC
Java
|Java平台概論
Java版本遷移
JDK規範與實作
JVM、JRE與JDK
|路徑/套件/模組
Hello,Java
JDK/JRE/類別版本
類別/原始碼路徑
package與import
初探模組
|語法基礎
型態
變數
運算子
型態轉換
if/else、switch
for、while迴圈
|類別與物件
定義類別
使用Scanner、BigDecimal
基本型態包裹器
陣列
字串
Java與Unicode
|封裝
流程與資料的封裝
public/建構式/重載
this與static
不定長度引數/內部類別
資料載體與record
|繼承
共同行為與isa
重新定義/abstract
protected/super
final/Object/instanceof
sealed類別
|介面
定義行為外觀
解決需求變化
介面語法細節
使用enum列舉
sealed介面
|例外
try/catch例外處理
要抓還是要拋?
堆疊追蹤與assert
finally資源關閉
|泛型
定義與使用泛型
Producerextends
Consumersuper
|Lambda
初試Lambda
Lambda運算式與函式介面
this與final
方法與建構式參考
GitHub
Twitter
Facebook
LinkedIn
Designs
Tags
BuiltwithbyHugo
HOME>
Java>
語法基礎>
運算子
算術運算
比較、條件運算
邏輯運算
位元運算
遞增、遞減運算
指定運算
operator
運算子
May20,2022
程式目的簡單地說就是運算,除了運算還是運算,程式語言中提供運算功能的就是運算子(Operator)。
算術運算
與算術相關的運算子+、-、*、/,也就是加、減、乘、除這類運算子,另外%,稱為模數運算子或餘除運算子。
算術運算子使用上與你學過的加減乘除一樣,也是先乘除後加減。
例如以下程式碼片段會在文字模式下顯示7:
System.out.println(1+2*3);
以下程式碼會顯示的是6:
System.out.println(2+2+8/4);
如果你想要的是2+2+8加總後,再除以4,請加上括號表示運算先後順序。
例如以下程式碼顯示的是3:
System.out.println((2+2+8)/4);
%運算子計算的結果是除法後的餘數,例如10%3會得到餘數1;一個使用%的例子是數字循環,假設有個立方體要進行360度旋轉,每次要在角度上加1,而360度後必須復歸為0重新計數,這時可以這麼撰寫:
varcount=0;
....
count=(count+1)%360;
在運算子的兩邊各留一個空白,這樣比較容易閱讀。
比較、條件運算
數學上有大於、等於、小於的比較運算,Java也提供了這些運算子,這些運算子稱之為比較運算子(Comparisonoperator),它們有大於(>)、不小於(>=)、小於(5結果%b%n",10>5);
System.out.printf("10>=5結果%b%n",10>=5);
System.out.printf("10<5結果%b%n",10<5);
System.out.printf("10<=5結果%b%n",10<=5);
System.out.printf("10==5結果%b%n",10==5);
System.out.printf("10!=5結果%b%n",10!=5);
}
}
程式的執行如下所示:
10>5結果true
10>=5結果true
10<5結果false
10<=5結果false
10==5結果false
10!=5結果true
==是兩個連續的=組成,而不是一個=,一個=是指定運算,這點必須特別注意。
例如若變數x與y要比較是否相等,應該是寫成x==y,而不是寫成x=y,後者作用是將y的值指定給x。
對於類別型態宣告的參考名稱來說,兩個參考名稱使用==比較時,是比較兩個名稱是否參考至同一物件。
Java有個條件運算子(Conditionaloperator),傳回值依條件式結果而定,如果條件式結果為true,則傳回:前的值,若為false,則傳回:後的值。
例如,若score是int宣告,儲存了使用者輸入的學生成績,以下程式片段可用來判斷學生是否及格:
System.out.printf("該生是否及格?%c%n",score>=60?'是':'否');
條件運算子使用適當的話可以少寫幾句程式碼。
例如,若number是int宣告,儲存使用者輸入的數字,則以下程式片段可判斷奇數或偶數:
System.out.printf("是否為偶數?%c%n",(number%2==0)?'是':'否');
邏輯運算
在邏輯上有所謂的「且」(AND)、「或」(OR)與「反相」(NOT),Java也提供對應的邏輯運算子(Logicaloperator),分別為&&(AND)、||(OR)及!(NOT)。
看看以下的程式片段會輸出什麼結果?
varnumber=75;
System.out.println(number>70&&number<80);
System.out.println(number>80||number<75);
System.out.println(!(number>80||number<75));
三段陳述句分別會輸出true、false與true三種結果,分別表示number大於70且小於80為真、number大於80或小於75為假、number大於80或小於75的相反為真。
&&與||有所謂捷徑運算(Short-CircuitEvaluation)。
因為AND只要其中一個為假,就可以判定結果為假,對&&來說,只要左運算元(Operand)評估為false,就會直接傳回false,不會再去運算右運算元。
因為OR只要其中一個為真,就可以判定結果為真,對||來說,只要左運算元評估為true,就會直接傳回true,就不會再去運算右運算元。
來舉個運用捷徑運算的例子,在Java兩個整數相除,若除數為0會發生ArithmeticException,代表除0的錯誤,以下運用&&捷徑運算避免了這個問題:
if(b!=0&&a/b>5){
//做一些事...
}
在這個程式片段中,變數a與b都是int型態,如果b為0的話,&&左邊運算元結果就是false,直接判斷整個&&的結果應是false,不用再去評估右運算元,從而避免了a/b而b等於0時的除零錯誤。
位元運算
在數位設計上有AND、OR、NOT、XOR與補數運算,Java提供對應的運位元運算子(BitwiseOperator),分別是&(AND)、|(OR)、^(XOR)與~(補數)。
如果不會基本位元運算,可以從以下範例瞭解各個位元運算結果:
packagecc.openhome;
publicclassBitwise{
publicstaticvoidmain(String[]args){
System.out.println("AND運算:");
System.out.printf("0AND0%5d%n",0&0);
System.out.printf("0AND1%5d%n",0&1);
System.out.printf("1AND0%5d%n",1&0);
System.out.printf("1AND1%5d%n",1&1);
System.out.println("\nOR運算:");
System.out.printf("0OR0%6d%n",0|0);
System.out.printf("0OR1%6d%n",0|1);
System.out.printf("1OR0%6d%n",1|0);
System.out.printf("1OR1%6d%n",1|1);
System.out.println("\nXOR運算:");
System.out.printf("0XOR0%5d%n",0^0);
System.out.printf("0XOR1%5d%n",0^1);
System.out.printf("1XOR0%5d%n",1^0);
System.out.printf("1XOR1%5d%n",1^1);
}
}
執行結果就是各個位元運算的結果:
AND運算:
0AND00
0AND10
1AND00
1AND11
OR運算:
0OR00
0OR11
1OR01
1OR11
XOR運算:
0XOR00
0XOR11
1XOR01
1XOR10
位元運算是逐位元運算,例如10010001與01000001做AND運算,是一個一個位元對應運算,答案就是00000001。
補數運算是將所有位元0變1,1變0。
例如00000001經補數運算就會變為11111110。
例如:
bytenumber=0;
System.out.println(~number);
上面的程式片段會顯示-1,因為byte佔記憶體一個位元組,number儲存的0在記憶體中是的位元00000000,經補數運算就變成11111111,這個數在電腦中用整數表示則是-1。
邏輯運算子與位元運算子也是很常被混淆的,像是&&與&,||與|,初學時可得多注意。
在位元運算上,Java還有左移(<>)兩個運算子,左移運算子會將所有位元往左移指定位數,左邊被擠出去的位元會被丟棄,而右邊補上0;右移運算則是相反,會將所有位元往右移指定位數,右邊被擠出去的位元會被丟棄,至於最左邊補上原來的位元,如果左邊原來是0就補0,1就補1。
還有個>>>運算子,這個運算子在右移後,最左邊一定是補0。
使用左移運算來作簡單的2次方運算示範:
packagecc.openhome;
publicclassShift{
publicstaticvoidmain(String[]args){
varnumber=1;
System.out.printf("2的0次方:%d%n",number);
System.out.printf("2的1次方:%d%n",number<<1);
System.out.printf("2的2次方:%d%n",number<<2);
System.out.printf("2的3次方:%d%n",number<<3);
}
}
執行結果:
2的0次方:1
2的1次方:2
2的2次方:4
2的3次方:8
實際來左移看看就知道為何可以如此作次方運算了:
00000001->1
00000010->2
00000100->4
00001000->8
遞增、遞減運算
在程式中對變數遞增1或遞減1是很常見的運算,例如:
vari=0;
i=i+1;
System.out.println(i);
i=i-1;
System.out.println(i);
這個程式片段會分別顯示出1與0兩個數,你可以使用遞增、遞減運算子來撰寫程式:
vari=0;
i++;
System.out.println(i);
i--;
System.out.println(i);
那麼哪個寫法比較好呢?就簡潔度而言,使用++、--的寫法比較好,就效率而言,其實沒差,因為如果你寫i=i+1,編譯器會自動幫你改成i++,同樣地,如果你寫i=i–1,編譯器會自動幫你改為i--。
上面的程式片段還可以再簡潔一些:
vari=0;
System.out.println(++i);
System.out.println(--i);
可以將++或–運算子撰寫在變數的前或後,不過兩種寫法有差別,將++或--運算子寫在變數前,表示先將變數值加或減1,然後再傳回變數值,將++或--運算子寫在變數後,表示先傳回變數值,然後再對變數加或減1。
例如:
vari=0;
varnumber=0;
number=++i;//結果相當於i=i+1;number=i;
System.out.println(number);
number=--i;//結果相當於i=i-1;number=i;
System.out.println(number);
在這個程式片段中,number的值會前後分別顯示為1與0。
再來看個例子:
vari=0;
varnumber=0;
number=i++;//相當於number=i;i=i+1;
System.out.println(number);
number=i--;//相當於number=i;i=i-1;
System.out.println(number);
在這個程式片段中,number的值會前後分別顯示為0與1。
指定運算
到目前為止只看過一個指定運算子,也就是=這個運算子,事實上指定運算子還有以下幾個:
指定運算子
範例
結果
+=
a+=b
a=a+b
-=
a-=b
a=a-b
*=
a*=b
a=a*b
/=
a/=b
a=a/b
%=
a%=b
a=a%b
&=
a&=b
a=a&b
=
a|=b
a=a|b
^=
a^=b
a=a^b
<<=
a<<=b
a=a<>=
a>>=b
a=a>>b
>»=
a>»=b
a=a>»b
延伸文章資訊
- 1第06 篇、位運算子- Java 程式設計
位運算. 數據在計算機中是以二進制的方式存放; 位元運算:對整數的二進制進行操作假設: a = 0110 1001B 、 b = 0101 110B ...
- 2Java 的算術運算子
位元運算子
- 3Java 運算式 - 翻轉工作室
運算子. 描 述. 指定運算子. 位元邏輯運算子. = 指定變數內容. ^. 位元 XOR. 算術運算子. &. 位元 AND. +, -. 一元(unary)正負符號. |. 位元 OR. +...
- 4Java :: 運算子
位元運算
- 5Java的運算子 - iT 邦幫忙
^:位元XOR運算,只有兩者其一有才為一,兩者皆有及兩者皆無都為零。 ~:取相反值,一變零,零變一。 <<:位元左移. :位元右 ...