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

《Java從小白到大?!芳堎|(zhì)版已經(jīng)上架了?。?!

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

6.4 位運算符

位運算是以二進位(bit)為單位進行運算的,操作數(shù)和結(jié)果都是整型數(shù)據(jù)。位運算符有如下幾個運算符:&、|、^、~、>>、<<和>>>,以及相應(yīng)的賦值運算符,具體說明參見表6-6。

表6-6 位運算符


**注意 無符號右移>>>運算符僅被允許用在int和long整數(shù)類型, 如果用于short或byte數(shù)據(jù), 則數(shù)據(jù)在位移之前,轉(zhuǎn)換為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));     ?

輸出結(jié)果如下:

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,為了便于查看代碼采用二進制整數(shù)表示。

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

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

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

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

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

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

代碼第?聲明int類型負數(shù)。右位移(>>>和>>)在負數(shù)情況下差別比較大。代碼第?行的(c >>> 2)表達式輸出結(jié)果是1073741821,這是一個如此大的正數(shù),從一個負數(shù)變成一個正數(shù),這說明無符號右位移對于負數(shù)計算會導(dǎo)致精度的丟失。而有符號右位移對于負數(shù)的計算是正確的,見代碼第?行。

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

6.5 其他運算符

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

  • 三元運算符(? :)。例如x?y:z;,其中x、y和z都為表達式。
  • 小括號。起到改變表達式運算順序的作用,它的優(yōu)先級最高。
  • 中括號。數(shù)組下標。
  • 引用號(.)。對象調(diào)用實例變量或?qū)嵗椒ǖ牟僮鞣?,也是類調(diào)用靜態(tài)變量或靜態(tài)方法的操作符。
  • 賦值號(=)。賦值是用等號運算符(=)進行的。
  • instanceof。判斷某個對象是否為屬于某個類。
  • new。對象內(nèi)存分配運算符。
  • 箭頭(->)。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運算符可以創(chuàng)建Date對象
        System.out.println(date.toString());    //通過.運算符調(diào)用方法

    }
}

此外,還有一些鮮為人知的運算符,隨著學(xué)習(xí)的深入用到后再為大家介紹,這里就不再贅述了。

6.6 運算符優(yōu)先級

在一個表達式計算過程中,運算符的優(yōu)先級非常重要。表6-7中從上到小,運算符的優(yōu)先級從高到低,同一行具有相同的優(yōu)先級。二元運算符計算順序從左向右,但是先級15的賦值運算符的計算順序從右向左的。

表6-7 Java運算符優(yōu)先級
[圖片上傳失敗...(image-34534b-1511744132099)]

總結(jié) 運算符優(yōu)先級大體順序,從高到低是:算術(shù)運算符→位運算符→關(guān)系運算符→邏輯運算符→賦值運算符。

本章小結(jié)

通過對本章內(nèi)容的學(xué)習(xí),讀者可以了解到Java語言的基本運算符,這些運算符包括算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符和其他運算符。

配套視頻

http://www.zhijieketang.com/classroom/6/courses

配套源代碼

http://www.zhijieketang.com/group/5

與本書免費版對應(yīng)的還有一個收費版本:

  1. 進入百度閱讀電子書

  2. 進入圖靈社區(qū)電子書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量、變量、屬性、下標構(gòu)造器協(xié)議擴展泛型類型別名位運算...
    寒橋閱讀 994評論 0 2
  • 高級運算符(Advanced Operators) 本文參考自蘋果官方文檔Advanced Operators本頁...
    果啤閱讀 1,696評論 1 5
  • 周六,我又奇葩了一回——陪現(xiàn)在的同桌去找她男朋友。也算是我倆的第一次同游吧。從學(xué)校坐十路到賢文莊,再坐116到終點...
    房子姑娘閱讀 260評論 1 1
  • 001 回顧以往你進行過的、面對多個聽眾的分享,在分享的內(nèi)容設(shè)計方面(意是內(nèi)容設(shè)計方面),有什么困惑? 002 你...
    撿到蜜罐的熊閱讀 183評論 0 0
  • 董小姐最近有點郁悶,她掰著手指頭算了算,今年已經(jīng)被三個男生拒絕過了,星座運勢上明明說她今年的桃花運一直會很旺盛,怎...
    越王姓李閱讀 1,178評論 7 21

友情鏈接更多精彩內(nèi)容