一、表達式
表達式由運算符和操作數組成
例如: 5
num1
num1+num2
sum=num1+num2
二、運算符分類
算數運算符、賦值運算符、關係運算符、邏輯運算符、條件運算符、位運算符
三、算數運算符
四、賦值運算符
格式:變量=表達式
例如:int n=3;//將3賦值給變量n
注意:賦值運算符是從右往左運算!賦值運算符的左邊不能是常量!
複合賦值運算符
五、關係運算符
比較運算符用於判斷兩個數據的大小,如大於
比較的結果是一個布爾值
六、邏輯運算符
短路運算符:&&和||,左邊的表達式值可以確定結果時,就不再繼續運算右邊的表達式的值
七、條件運算符
Java中的條件運算符是三目運算符
語法:布爾表達式?表達式1:表達式2
八、位運算符
操作二進制位,&,|,<<、>>、>>>
九、運算符優先級
優先級 |
運算符 |
結合性 |
---|---|---|
1 |
() [] . |
從左到右 |
2 |
! +(正) -(負) ~ ++ -- |
從右向左 |
3 |
* / % |
從左向右 |
4 |
+(加) -(減) |
從左向右 |
5 |
<< >> >>> |
從左向右 |
6 |
< <= > >= instanceof |
從左向右 |
7 |
== != |
從左向右 |
8 |
&(按位與) |
從左向右 |
9 |
^ |
從左向右 |
10 |
| |
從左向右 |
11 |
&& |
從左向右 |
12 |
|| |
從左向右 |
13 |
?: |
從右向左 |
14 |
= += -= *= /= %= &= |= ^= ~= <<= >>= >>>= |
從右向左 |
ps:&、|、^這三個運算符在操作數分別是數值類型和布爾類型的時候,表示的含義分別是按位與、按位或、按位異或和邏輯與、邏輯或、邏輯異或。上面的表格我其實沒有標識出來是按位還是邏輯,如果有大佬知道優先級的話麻煩在下方評論!
十、位運算符的使用
共同特性:先將操作數轉換成二進制,然後按照二進制位做運算,移位運算符如果超出二進制位的部分丟棄
10.1、<<左移運算符
含義:使指定值的所有位都左移規定的次數
語法格式:value << num
規則:
- 低位補0
- 如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33-32=1位
- 當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
10.2、>>右移運算符
含義:使指定值的所有位都右移規定的次數
語法格式:value >> num
規則:
- 高位補符號位,即正數高位補0,負數高位補1
- 如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33-32=1位
- 當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
10.3、>>>無符號右移運算符
語法格式:value >>> num
規則:
- 忽視符號位,高位補0
- 當無符號右移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。
10.4、示例代碼
package org.cc.javase;
/**
* 位運算符示例
* @author cc
*
*/
public class BitOperator {
private static int a = 60;//0011 1100
private static int b = 13;//0000 1101
private static int c = -116;
public static void main(String[] args) {
//Integer.toBinaryString方法:若高位有連續的0,則高位不顯示
// yu(a,b);//兩個正數做與運算
// yu(a,c);//正負數做與運算,結果一定是一個正數
// huo(a,b);//兩個正數做或運算
// yh(a,b);//兩個正數做異或運算
// qf(a);//正數做取反運算
// yy(b,2);//正數右移兩位
// yy(c,2);//負數右移兩位
// zy(b,2);//正數左移兩位
// zy(c,2);//負數左移兩位
// yy1(c,2);//負數無符號右移兩位
}
/**
* & 與運算
* @param a
* @param b
*/
private static void yu(int a,int b){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作數b:"+complement0(b));
System.out.println("操作結果"+complement0(a&b));
System.out.println(a&b);
}
/**
* | 或運算
* @param a
* @param b
*/
private static void huo(int a,int b){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作數b:"+complement0(b));
System.out.println("操作結果:"+complement0(a|b));
System.out.println(a|b);
}
/**
* ^ 異或運算
* @param a
* @param b
*/
private static void yh(int a,int b){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作數b:"+complement0(b));
System.out.println("操作結果:"+complement0(a^b));
System.out.println(a^b);
}
/**
* ~ 取反
* @param a
*/
private static void qf(int a){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作結果:"+complement0(~a));
System.out.println(~a);
}
/**
* >> 帶符號右移
* @param a
*/
private static void yy(int a,int bitNum){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作結果:"+complement0(a>>bitNum));
System.out.println(a>>bitNum);
}
/**
* << 帶符號左移
* @param a
*/
private static void zy(int a,int bitNum){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作結果:"+complement0(a<<bitNum));
System.out.println(a<<bitNum);
}
/**
* >>> 不帶符號右移
* @param a
*/
private static void yy1(int a,int bitNum){
System.out.println("操作數a:"+complement0(a));
System.out.println("操作結果:"+complement0(a>>>bitNum));
System.out.println(a>>>bitNum);
}
/*
* 將高位的0也顯示出來
*/
private static String complement0(int number){
String binaryStr = Integer.toBinaryString(number);
StringBuffer sb = new StringBuffer();
if(binaryStr.length()<32){
int count = 32-binaryStr.length();
for(int i=0;i<count;i++) sb.append("0");
}
return sb.append(binaryStr).toString();
}
}