1. 程式人生 > >邏輯運算子、位運算子、移位運算子、三目運算子、運算子的優先順序

邏輯運算子、位運算子、移位運算子、三目運算子、運算子的優先順序

一、邏輯運算子 :邏輯運算子的作用是用於連線布林表示式的。
1、& (與,並且)
規律: 只有左右變數同時為true,那麼結果才是true,否則就false。

2、| (或,或者)
規律: 只要兩邊的布林表示式有一邊為true,那麼結果就為true,只有兩邊同時為false 的時候,結果才是false。

3、^ (異或)
規律: 只要兩邊的布林表示式結果不一致,那麼結果就為true,如果左右兩邊的布林表示式一致,那麼就為false。

4、! (非)

5、&& (短路與\雙與)
短路與和單與符號的相同與不同點:
1)相同點: 運算的結果是一樣的。
2)不同點: 使用短路與的時候,如果左邊的布林表示式為false,則不會在運算右邊的布林表示式,從而提高了效率。使用單與的時候,即使發現左邊的布林表示式為false,還是會運算右邊的布林表示式的。
那麼有這樣一個問題:單與的效率高於雙與?


錯,只有左邊的布林表示式為false時,雙與的效率才要高於單與的。

6、|| (短路或\雙或)
短路或與單或的相同點與不同點:
1)相同點:運算的結果是一致的。
2)不同點:使用短路或的時候,當發現左邊的布林表示式為true時,則不會運算右邊的布林表示式。使用單或的時候發現左邊的布林表示式為true,還是會運算右邊布林表示式。

二、位運算子:位運算子就是直接操作二進位制位的,這樣效率可能會高一些,因為計算機就是通過二進位制對資料進行存取的。
1、位運算子與邏輯運算子的區別:
用於int型別資料時,就是位運算子。用於布林表示式時就是邏輯運算子。

2、& (與)

3、| (或)

4、^ (異或)
規律: 如果運算元A連續異或同一個運算元兩次,那麼結果還是運算元A。

5、~ (取反)
舉例:

分析:

6、應用:使用異或對圖片資料進行加密。

import java.io.*;
class ImageTest{
    public static void main(String[] args)  throws Exception{
        //找到圖片檔案
        File inFile = new File("e:\\圖片.jpg");
        File outFile = new File("e:\\加密後的圖片.jpg"
); //建立資料通道,讓圖片的二進位制資料流入 FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //邊讀,邊把讀到的資料異或一個數據,再把這個資料寫出 int content = 0; //該變數是用於儲存讀取到的資料 // 如果沒有到檔案的末尾,那麼繼續讀取資料,讀取到的資料已經儲存到content變數中了。 while((content = input.read())!=-1){ //加密方式與12做異或運算 output.write(content^12); } //關閉資源 output.close(); input.close(); } }

7、位運算子可能會出現的筆試題目:
1)交換兩個變數的值,不準出現第三方變數。

class Demo1{
    public static void main(String[] args){
        int a = 3;
        int b = 5;

        //方式1:定義第三方變數。
        int temp = a;   //3 
        a = b;          //a = 5 
        b = temp; 

        //方式2:相加法, 缺點:兩個int型別的資料相加,有可能會出現超出int的表示範圍。
        a = a+b;    // a =8
        b = a-b;    //b = 8 - 5 = 3
        a = a-b;    // a = 8 - 3 = 5

        //方式3: 可以使用異或。 缺點: 邏輯不清晰。
        a = a^b;  // a = 3^5
        b = a^b;  // b = (3^5)^5 = 3
        a = a^b; //  a = (3^5)^3 = 5    注意:(3^5)和(5^3)是一樣的 
    }
}

2)取出一個二進位制資料的指定位數。要求讀取該二進位制資料的低4位
答:

三、移位運算子(也是對二進位制數進行操作的):
1、<<(左移)
規律:一個運算元進行左移運算的時候,結果就是等於運算元乘以2的n次方,n就是左移 的位數.
3<<1 = 3 *2(1) = 6;
3<<2 = 3*2(2) = 12
3<<3 = 3*2(3) = 24

2、>>(右移)
規律:一個運算元在做右移運算的時候,實際上就是等於該運算元除以2的n次方,n就是右移的位數。
3>>1 = 3 / 2(1) = 1
3>>2 = 3 / 2(2) = 0

3、>>>(無符號右移) :
無符號右移與右移的區別:進行右移運算的時候,如果運算元是一個正數,那麼左邊的空缺位使用0補,如果運算元是一個負數,那麼左邊的空缺位使用1補。而使用無符號右移的時候,不管是正數還是負數都統一使用0補。

4、沒有無符號左移:原因不用解釋了吧。

5、筆試題目:使用最高的效率算出2乘以8的結果。
答:2<<3 = 2*2(3) = 16; 因為只有一個運算元(2),所以效率相對較高。

四、三元運算子(三目運算子)
1、格式:布林表示式?值1:值2 ;
2、三元運算子要注意的細節:
使用三元運算子的時候,一定要使用該表示式返回的結果,或者是定義一個變數接收該表示式返回的結果。
說簡單點就是不能讓還有三目運算子的語句自成一句,例如:age>=18?"成年人":"未成年人";,這種報錯。
應該是:result = (age>=18?"成年人":"未成年人");
或是:System.out.println(age>=18?"成年人":"未成年人");

五、運算子的優先順序: