《Java架構築基》從Java基礎講起——Java運算符

1. 有哪些運算符

Java提供了豐富的運算符,能夠將之分爲四種:算術運算符、位運算符、關係運算符、邏輯運算符ide

2. 算術運算符

算術運算符的操做對象必須是數值類型,不能爲boolean類型使用算術運算符,可是能夠爲char類型使用算術運算符。由於在Java中,char類型在本質上是int的子集。 |運算符|含義| |:--:|:--:| |+|加法(也是一元加號)| |-|減法(也是一元減號)| ||乘法| |/|除法| |%|求模| |++|自增| |- -|自減| |+=|加並賦值| |-=|減並賦值| |=|乘並賦值| |/=|除並賦值| |%=|求模並賦值|編碼

3. 位運算符

Java定義了幾個位運算符,可用於整數類型——long,int,short,char和byte。 |運算符|含義| |:--:|:--:| |~|按位一元取反| |&|按位與| |||按位或| |^|按位異或| |>>|右移| |>>>|右移零填充| |<<|左移| |&=|按位與並賦值| | |= |按位或並賦值| |^=|按位異或並賦值| |>>=|右移並賦值| |>>>=|右移零填充並賦值| |<<=|左移並賦值|code

在Java中,全部整數類型都由寬度可變的二進制數字表示,除char類型外都是有符號整數,這意味着它們便可表示正數,也能夠表示負數。對象

Java中使用「2的補碼」進行編碼,即負數的表示方法爲:首先反轉數值中的全部位(1變爲0,0變爲1),而後再將結果加1。例如,-42的表示方法爲:經過反轉42中的全部位(00101010),獲得11010101,而後再加1,獲得11010110,即-42。 爲了解碼負數,首先反轉全部位,而後加1。例如,反轉-42(11010110),獲得00101001,即41,再加一則獲得42。it

3.1 位邏輯運算符

位邏輯運算符包括&、|、^和~。class

  • 運算規則以下表所示 |A|B|A|B|A&B|A^B|~A |:--:|:--:|:--:|:--:|:--:|:--:| |0|0|0|0|0|1| |1|0|1|0|1|0| |0|1|1|0|1|1| |1|1|1|1|0|0|

3.2 左移

左移運算符「<<」能夠將數值中的全部位向左移動指定的次數,格式爲:擴展

value << num
  • num指定了將value中的值向左移動的次數,對於高階位,每次左移都被移出並丟失,右邊的位用0補充。這意味着左移int類型操做數時,若是某些位一旦超出31位,那麼這些位將丟失。若是操做數是long類型,那麼超出位63的位會丟失。
  • 當左移byte和short型數據時,Java的自動類型提高會致使意外的結果。當對錶達式進行求值時,byte和short型數值會被提高爲int類型,且表達式的結果也是int型。
  • 這意味着對byte和short型數值進行左移操做的結果爲int型,若移動的位數不超出位31,則移動的位不會丟失。此外,當將負的byte和short型數值提高爲int型時,會進行符號擴展,所以高階位將使用1填充。
  • 例如,若是左移byte型數值,會先將該數值提高爲int型,而後左移。這意味着若是想要的結果是移位後的byte型數值,就必須丟棄結果的前三個字節,能夠經過將結果強制轉換爲byte類型來完成位數截取。

舉個例子:二進制

public static void main(String[] args) {
    public static void main(String[] args) {
        //0011 1100
        byte a = 60;
        // a首先被提高爲int類型,即(0000 0000 0000 0000 0000 0000 0011 1100)
        // 左移兩位,結果爲(0000 0000 0000 0000 0000 0000 1111 0000),即240
        int i = a << 2;
        // 先左移兩位,結果爲(0000 0000 0000 0000 0000 0011 1100 0000)
        // 捨棄前三個字節,獲得(1100 0000),即-64
        byte b = (byte) (i << 2);
        System.out.println("i等於:" + i);
        System.out.println("b等於:" + b);
    }
}

輸出結果是:方法

i等於:240
b等於:-64

由於每次左移都至關於將原始值乘2,因此能夠將之做爲乘法的搞笑替代方法。可是若是將二進制1移進高階位,結果將會變成負數。數據

3.3 右移

右移的規則與左移相似,實例代碼以下:

public static void main(String[] args) {
    //0011 1100
    byte a = 60;  
    // a首先被提高爲int類型,即(0000 0000 0000 0000 0000 0000 0011 1100)
    // 右移兩位,結果爲(0000 0000 0000 0000 0000 0000 0000 1111),即15
    int i = a >> 2;
    // 先右移兩位,結果爲(0000 0000 0000 0000 0000 0000 0000 0011)
    // 捨棄前三個字節,獲得(0000 0011),即3
    byte b = (byte) (i >> 2);
    System.out.println("i等於:" + i);
    System.out.println("b等於:" + b);
}

執行結果

i等於:15
b等於:3

每次右移一位,至關於將該值除以2,並捨棄全部餘數。能夠利用這一特性實現高效的除法操做。

  • 當進行右移操做時,右移後的頂部(最左邊)位使用右移前頂部爲使用的值填充,這稱爲符號擴展。當對負數進行右移操做時,該特性能夠保留負數的符號。
    public static void main(String[] args) {
    byte a=(byte) 0b11111000;
    System.out.println("a等於:"+a);
    int b=a>>1;
    System.out.println("b等於:"+b);
    }

    執行結果

    a等於:-8
    b等於:-4

3.4 無符號右移

每次移位時,「>>」運算符自動使用原來的內容填充高階位,這個特性能夠保持數值的正負性。可是,有時候對那些非數值的內容進行移位操做,並不關心高階位初始值是多少,只但願用0來填充高階位,這就是無符號右移。

  • 爲了完成無符號右移,須要使用Java的無符號右移運算符「>>>」,該運算符老是將0移進高階位。
    public static void main(String[] args) {
    //二進制表示(11111111 11111111 11111111 11111111)
    int a=-1;
    System.out.println(a);
    //右移二十四位(00000000 00000000 00000000 11111111)
    a=a>>>24;
    //輸出結果是 255
    System.out.println(a); 
    }

4. 關係運算符

關係運算符用於斷定一個操做數與另外一個操做數之間的關係。 |運算符|結果| |:--:|:--:| |==|等於| |!=|不等於| |>|大於| |<|小於| |>=|大於等於| |<=|小於等於|

5. 邏輯運算符

關係運算符用於斷定一個操做數與另外一個操做數之間的關係。 |運算符|結果| |:--:|:--:| |&|邏輯與| |||邏輯或| |^|邏輯異或| ||||短路或| |&&|短路與| |!|邏輯一元非| |&=|邏輯與並賦值| ||=|邏輯或並賦值| |^=|邏輯異或並賦值| |==|等於| |!=|不等於| |?:|三元運算符|

相關文章
相關標籤/搜索