Java基礎:&與&&,|與| |的聯絡與區別(詳解及示例)
&與&& 的聯絡與區別
一、&與&&的相同點
&與&& 都可作為 邏輯“與”的運算,即當運算子兩邊表示式結果都為True時,運算結果返回True;否則當某一表達式為False時,運算結果返回False 。
二、&與&&的不同點
1、& :“按位與”
“按位與”:就是說,當兩邊表示式不是判斷(a>b & a>c)而是數字如:1 & 8 ,‘&’就作為按位“與”運算;即將兩個數字進行二進位制位“與”運算:當兩個相應二進位制位都為1時,結果位為1
特別注意的是:"結果位為1,而不是結果返回1;也就是說 返回的結果是某個值而不僅僅是0或1。
例如 :在java中int型別是4kb也就是32位;(略去前面幾位,只寫後4位或後8位)
1 & 8:‘1’ 的二進位制表示為 0001 ;‘8’的二進位制表示為 1000 ;則1&8表示為 0001&1000 = 0000 ,再轉十進位制返回值為 0 ;
23 & 15:‘23’的二進位制表示為 0001 0111 ;‘15’的二進位制表示為 0000 1111 ;則23&15表示為 0001 0111 & 0000 1111 = 0000 0111 ,轉十進位制返回值為 7 。
上面例子只涉及到正數, 負數
以 -9 為例:步驟如下(只講步驟,具體運算例項就不再詳述)
1. -9 的絕對值:9的二進位制位 0000 1001, 稱該碼為**原碼**。
2. 上述‘原碼’的基礎上“取反”得:1111 0110 ,稱該碼為**反碼** 。
3. 最後在‘反碼’的基礎上“加1”得:1111 0111 ,稱該碼為**補碼**,即該碼為負數的二進位制表示。
2、&&: “短路與”
這個很好理解。即當第一個表示式為False時,將不再執行第二個表示式(無論表示式是否丟擲異常),直接返回False。
但需要注意的是:使用“&&”時,兩邊的表示式一定是判斷表示式即 返回的結果是True和False;若兩邊表示式為數值(1 && 8 或 8>1 && 8),將出現語法錯誤,程式編譯無法通過。
| 與 | | 的聯絡與區別(和上述&與&&原理相同)
一、 | 與 | | 的相同點
| 與| | 都可作為 邏輯“或”的運算,即當運算子任意一個表示式結果為True時,運算結果返回True;僅當兩個表示式都為False時,運算結果返回False 。
二、| 與 | | 的不同點
1. | :“按位或”
和&類似,進行二進位制運算;但與&的區別是當表示式為數值時,將兩個數字進行二進位制位“或”運算:任意某個二進位制位為 1 時,結果位為 1。
例 7|8 :0111 | 1000 = 1111 ,轉換十進位制返回值為 15 。
例 1|9 :0001 | 1001 = 1001,轉換十進位制返回值為 9 。(不再具體詳述,參考上述&“按位與”運算)
2. | | :“短路或”
當第一個判斷表示式為True時,不再執行後面的判斷表示式(第二個表示式不會執行),直接返回True。