《Java從小白到大牛》紙質版已經上架了!!php
本文是《Java從小白到大牛精簡版》之第6章 運算符(上)繼續...html
位運算是以二進位(bit)爲單位進行運算的,操做數和結果都是整型數據。位運算符有以下幾個運算符:&、|、^、~、>>、<<和>>>,以及相應的賦值運算符,具體說明參見表6-6。java
表6-6 位運算符
[圖片上傳失敗...(image-a9ef68-1511744132099)]數組
注意 無符號右移>>>運算符僅被容許用在int和long整數類型, 若是用於short或byte數據, 則數據在位移以前,轉換爲int類型後再進行位移計算。
位運算示例代碼:ide
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,爲了便於查看代碼採用二進制整數表示。code
代碼第③行中表達式(a | b)進行位或運算,結果是二進制的0B01111110。a和b按位進行或計算,只要有一個爲1,這一位就爲1,不然爲0。視頻
代碼第④行(a & b)是進行位與運算,結果是二進制的0B00010010。a和b按位進行與計算,只有兩位所有爲1,這一位才爲1,不然爲0。htm
代碼第⑤行(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位,至關於操做數除以2<sup>n</sup>,例如代碼第⑦行(a >> 2)表達式至關於(a / 2<sup>2</sup>),a = 50因此結果等於12,相似的還有代碼第⑧行和第⑭行。另外,左位移n位,至關於操做數乘以2<sup>n</sup>,例如代碼第⑩行(a << 2)表達式至關於(a 2<sup>2</sup>),a = 50因此結果等於200,相似的還有代碼第⑪行。**
除了前面介紹的主要運算符,Java還有一些其餘一些運算符。
示例代碼以下:
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-7中從上到小,運算符的優先級從高到低,同一行具備相同的優先級。二元運算符計算順序從左向右,可是先級15的賦值運算符的計算順序從右向左的。
表6-7 Java運算符優先級
[圖片上傳失敗...(image-34534b-1511744132099)]
總結 運算符優先級大致順序,從高到低是:算術運算符→位運算符→關係運算符→邏輯運算符→賦值運算符。
經過對本章內容的學習,讀者能夠了解到Java語言的基本運算符,這些運算符包括算術運算符、關係運算符、邏輯運算符、位運算符和其餘運算符。
http://edu.51cto.com/topic/1246.html
http://www.51work6.com/book/java1.php