邏輯運算子、位運算子、移位運算子、三目運算子、運算子的優先順序
一、邏輯運算子 :邏輯運算子的作用是用於連線布林表示式的。
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?"成年人":"未成年人");
五、運算子的優先順序: