【JAVA基礎篇】運算符

一、表達式

表達式由運算符和操作數組成

例如: 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

規則:

  1. 低位補0
  2. 如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33-32=1位
  3. 當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

10.2、>>右移運算符

含義:使指定值的所有位都右移規定的次數

語法格式:value >> num

規則:

  1. 高位補符號位,即正數高位補0,負數高位補1
  2. 如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33-32=1位
  3. 當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

10.3、>>>無符號右移運算符

語法格式:value >>> num

規則:

  1. 忽視符號位,高位補0
  2. 當無符號右移的運算數是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();
	}
	
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章