天天看點

《Java從小白到大牛精簡版》之第6章 運算符(下)

《Java從小白到大牛》紙質版已經上架了!!!

《Java從小白到大牛精簡版》之第6章 運算符(下)

本文是​​《Java從小白到大牛精簡版》之第6章 運算符(上)​​繼續…

6.4 位運算符

位運算是以二進位(bit)為機關進行運算的,操作數和結果都是整型資料。位運算符有如下幾個運算符:&、|、^、~、>>、<<和>>>,以及相應的指派運算符,具體說明參見表6-6。

表6-6 位運算符

《Java從小白到大牛精簡版》之第6章 運算符(下)

**注意 無符号右移>>>運算符僅被允許用在int和long整數類型, 如果用于short或byte資料, 則資料在位移之前,轉換為int類型後再進行位移計算。

**

位運算示例代碼:

byte a = 0B00110010; //十進制50 ① 
 byte b = 0B01011110; //十進制94 ②System.out.println(“a | b = ” + (a | b)); // 0B01111110 ③ 
 System.out.println(“a & b = ” + (a & b)); // 0B00010010 ④ 
 System.out.println(“a ^ b = ” + (a ^ b)); // 0B01101100 ⑤ 
 System.out.println(“~b = ” + (~b)); // 0B10100001 ⑥System.out.println(“a >> 2 = ” + (a >> 2)); // 0B00001100 ⑦ 
 System.out.println(“a >> 1 = ” + (a >> 1)); // 0B00011001 ⑧ 
 System.out.println(“a >>> 2 = ” + (a >>> 2)); // 0B00001100 ⑨ 
 System.out.println(“a << 2 = ” + (a << 2)); // 0B11001000 ⑩ 
 System.out.println(“a << 1 = ” + (a << 1)); // 0B01100100 ⑪int c = -12; ⑫ 
 System.out.println(“c >>> 2 = ” + (c >>> 2)); ⑬ 
 System.out.println(“c >> 2 = ” + (c >> 2)); ⑭ 
 輸出結果如下:a | b = 126 
 a & b = 18 
 a ^ b = 108 
 ~b = -95 
 a >> 2 = 12 
 a >> 1 = 25 
 a >>> 2 = 12 
 a << 2 = 200 
 a << 1 = 100 
 c >>> 2 = 1073741821 
 c >> 2 = -3      

上述代碼第①行和第②行分别定義了byte變量a和b,為了便于檢視代碼采用二進制整數表示。

代碼第③行中表達式(a | b)進行位或運算,結果是二進制的0B01111110。a和b按位進行或計算,隻要有一個為1,這一位就為1,否則為0。

代碼第④行(a & b)是進行位與運算,結果是二進制的0B00010010。a和b按位進行與計算,隻有兩位全部為1,這一位才為1,否則為0。

代碼第⑤行(a ^ b)是進行位異或運算,結果是二進制的0B01101100。a和b按位進行異或計算,隻有兩位相反時這一位才為1,否則為0。

代碼第⑦行(a >> 2)是進行有符号右位移2位運算,結果是二進制的0B00001100。a的低位被移除掉,由于是正數符号位是0,高位空位用0補。類似代碼第⑧行(a >> 1)是進行右位移1位運算,結果是二進制的0B00011001。

代碼第⑨行(a >>> 2)是進行無符号右位移2位運算,與代碼第⑦行不同的是,無論是否有數符号位,高位空位用0補,是以在正數情況下>>和>>>運算結果是一樣的。

代碼第⑩行(a << 2)是進行左位移2位運算,結果是二進制的0B11001000。a的高位被移除掉,低位用0補位。類似代碼第⑪行(a << 1)是進行左位移1位運算,結果是二進制的0B01100100。

代碼第⑫聲明int類型負數。右位移(>>>和>>)在負數情況下差别比較大。代碼第⑬行的(c >>> 2)表達式輸出結果是1073741821,這是一個如此大的正數,從一個負數變成一個正數,這說明無符号右位移對于負數計算會導緻精度的丢失。而有符号右位移對于負數的計算是正确的,見代碼第⑭行。

提示 有符号右移n位,相當于操作數除以2n,例如代碼第⑦行(a >> 2)表達式相當于(a / 22),a = 50是以結果等于12,類似的還有代碼第⑧行和第⑭行。另外,左位移n位,相當于操作數乘以2n,例如代碼第⑩行(a << 2)表達式相當于(a * 22),a = 50是以結果等于200,類似的還有代碼第⑪行。

6.5 其他運算符

除了前面介紹的主要運算符,Java還有一些其他一些運算符。

三元運算符(? :)。例如x?y:z;,其中x、y和z都為表達式。

小括号。起到改變表達式運算順序的作用,它的優先級最高。

中括号。數組下标。

引用号(.)。對象調用執行個體變量或執行個體方法的操作符,也是類調用靜态變量或靜态方法的操作符。

指派号(=)。指派是用等号運算符(=)進行的。

instanceof。判斷某個對象是否為屬于某個類。

new。對象記憶體配置設定運算符。

箭頭(->)。Java 8新增加的,用來聲明Lambda表達式。

雙冒号(::)。Java 8新增加的,用于Lambda表達式中方法的引用。

示例代碼如下:

import java.util.Date;
public class HelloWorld {
public static void main(String[] args) {

    int score = 80;
    String result = score > 60 ? "及格" : "不及格"; // 三元運算符(? : )
    System.out.println(result);

    Date date = new Date();         // new運算符可以建立Date對象
    System.out.println(date.toString());    //通過.運算符調用方法

}
}      

此外,還有一些鮮為人知的運算符,随着學習的深入用到後再為大家介紹,這裡就不再贅述了。

6.6 運算符優先級

在一個表達式計算過程中,運算符的優先級非常重要。表6-7中從上到小,運算符的優先級從高到低,同一行具有相同的優先級。二進制運算符計算順序從左向右,但是先級15的指派運算符的計算順序從右向左的。

表6-7 Java運算符優先級

[圖檔上傳失敗…(image-34534b-1511744132099)]

總結 運算符優先級大體順序,從高到低是:算術運算符→位運算符→關系運算符→邏輯運算符→指派運算符。

本章小結

通過對本章内容的學習,讀者可以了解到Java語言的基本運算符,這些運算符包括算術運算符、關系運算符、邏輯運算符、位運算符和其他運算符。

配套視訊