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
結果分析:
- x轉換爲二進制位 10000000 00000000 00000000 00010000 ,
- 在計算機中保存的是補碼 11111111 11111111 11111111 1111 0000 ,
- 無符號右移2位之後的值爲 00111111 111111111111 1111 1111 1100
- 將其轉爲10進制 就是107374182