Java 邏輯運算子、位運算子、移位操作符 總結 作者:王可利(Star·星星)
邏輯運算子,表格如下:
解析邏輯運算子表:
1.與 (&)
特點:兩個都為真的時候,結果為真。兩個為假的時候,結果為假。如果存在一個是假的,結果都為假的。
2.或(|)
特點:兩個都為真的時候,結果為真。兩個都為假的時候都是假的。如果存在一個是真的,結果都為真的。
3.異或(^)
特點:異,表示不一樣的意思。所以兩個判斷都是一樣的情況下,結果為假。兩個判斷結果都是不一樣的情況下,結果為真的。
4.非(!)
特點:取非,如果是真的,那麼結果就為假的。如果是假的,那麼結果就為真的。
5.雙與(&&)、雙或 (||) ——>短路
特點:
在java裡面,單個與(或) 和 兩個與(或)運算方式是不一樣,結果是一樣的。
單個與(或)會把所有的條件都判斷一次,運算方式,不管第一個條件是假的還是真的,都會把後面的條件判斷完了之後再輸出結果。
兩個與(或),如果第一個數是真的,或者是假的就直接運行了,就不會再判斷後面的條件,但是輸出的結果真假和單與(或)沒什麼不一樣。
所以單個與(或)要比 兩個 兩個與(或)效率稍微高了一點。
位運算子
介紹:任何資訊在計算機中都是以二進位制的形式儲存的,與(&)、或(|)、異或(^)除了可以作為邏
輯運算子也可以作為位運算子。位運算是直接對二進位制進行運算。
位(bit)運算子:
位運算子 |
運算子含義 |
& |
與(AND) |
| |
或(OR) |
^ |
異或 |
~ |
取反 |
規則:非零即真,所以 1 為 true ,0 為 false
參考邏輯運算子可以得出以下結論:
只有參與運算的兩位都為1,&運算的結果才為1,否則就為0。
只有參加運算的兩位都是0,| 運算的結果才是0,否則都是1。
只有參加運算的兩位不同,^ 運算的結果才為1,否則就為0。
1、& 與運算
& 參見運算的兩位數都為1,&運算子結果才為1,否則就為0。
6 & 3
00000000 |
00000000 |
00000000 |
00000110 |
6 |
00000000 |
00000000 |
00000000 |
00000011 |
3 |
00000000 |
00000000 |
00000000 |
00000010 |
& = 2 |
2、|
或運算
| 參與運算的兩位都為0,|運算的結果才為0,否則就為1。
6 & 3
00000000 |
00000000 |
00000000 |
00000110 |
6 |
00000000 |
00000000 |
00000000 |
00000011 |
3 |
00000000 |
00000000 |
00000000 |
00000111 |
| = 7 |
3、^
異或運算
^只有參加運算的兩位不同,^運算的結果才為1,否則就為0。
6 & 3
00000000 |
00000000 |
00000000 |
00000110 |
6 |
00000000 |
00000000 |
00000000 |
00000011 |
3 |
00000000 |
00000000 |
00000000 |
00000101 |
^ = 5 |
4、~ 反碼
就是取反,二進位制只有1和0,取反就是如果為1,取反就是0,如果是0,取反就是1。
0000-0000 |
0000-0000 |
0000-0000 |
0000-0110 |
6 |
1111-1111 |
1111-1111 |
1111-1111 |
1111-1001 |
取反 -7 |
System.out.println(~6);//-7
結論:當參與取反的數值是正數時,把對應的值加上負號,再-1;
當參與取反的數值是負數時,把對應的值加上負號,再-1;
。負數的最高位肯定是1。
負數表示
負數對應的正數的二進位制-1,然後取反。
-6
0000-0000 |
0000-0000 |
0000-0000 |
0000-0110 |
6 |
1111-1111 |
1111-1111 |
1111-1111 |
1111-1001 |
取反 |
1111-1111 |
1111-1111 |
1111-1111 |
1111-1010 |
加1 |
5、異或特點
一個數異或同一個數兩次,結果還是那個數. 用處一個簡單的加密思想.
6^3^3
0000-0000 |
0000-0000 |
0000-0000 |
0000-0110 |
6 |
0000-0000 |
0000-0000 |
0000-0000 |
0000-0011 |
^3 |
0000-0000 |
0000-0000 |
0000-0000 |
0000-0101 |
前面的結果 |
0000-0000 |
0000-0000 |
0000-0000 |
0000-0011 |
^3 |
0000-0000 |
0000-0000 |
0000-0000 |
0000-0110 |
結果是6 |
移位操作符
表格如下:
位運算子 |
||
運算子 |
運算 |
範例 |
<< |
左移 |
3 |
>> |
右移 |
3 |
>>> |
無符號右移 |
3 |
& |
與運算 |
6 |
| |
或運算 |
6 | |
^ |
異或運算 |
6 ^ |
~ |
反碼 |
~6 = |
位運算子的細節 |
|
<< |
空位補0,被移除的高位丟棄,空缺位補0。 |
>> |
被移位的二進位制最高位是0,右移後,空缺位補0; 最高位是1,空缺位補1。 |
>>> |
被移位二進位制最高位無論是0或者是1,空缺位都用0補。 |
& |
二進位制位進行&運算,只有1&1時結果是1,否則是0; |
| |
二進位制位進行 | 運算,只有0 | 0時結果是0,否則是1; |
^ |
任何相同二進位制位進行 ^ 運算,結果是0。 1^1=0 , 0^0=0 不相同二進位制位 ^ 運算結果是1。 1^0=1 , 0^1=1 |
解析表內容:
1、左移(算術移位)
3 <<
2
首先將3轉換為2進位制,
00000000 |
00000000 |
00000000 |
00000011 |
3 的二進位制 |
||
00000000 |
00000000 |
00000000 |
000011 |
左移2位,砍掉高位 |
||
0000 0000 |
0000 0000 |
0000 0000 |
0000 1100 |
低位補0 |
||
結果是12,所以3<<2 = 12;
的位移個數次冪.
2、右移
6>>2
00000000 |
00000000 |
00000000 |
00000110 |
6的二進位制 |
||
000000 |
00000000 |
00000000 |
00000001 |
右移10被砍掉 |
||
00000000 |
00000000 |
00000000 |
00000001 |
高位補0 |
||
結果是1,所以6>>2 = 1;
次方,右移一位就是除以 2的一次方。一個數往左移越移越大,往右邊移越來越小。
3、無符號右移(邏輯移位)
通過演示發現右移時高位就空了出來,>>
右移時高位補什麼要按照原有資料的最高位來決定。
1111-1111
1111-1111 1111-1111 1111-1010
-6 >> 2
1111-1111
1111-1111 1111-1111 1111-0010
最高位補什麼要看原有最高位是什麼
那麼使用>> 後原來是最高位1 的那麼空出來的最高位還是1 的,是0的還是0。
如果使用>>> 無論最高位是0還是1 空餘最高位都拿0 補,這就是無符號右移。
1111-1111
1111-1111 1111-1111 1111-1010
-6 >>> 2
001111-1111
1111-1111 1111-1111 1111-10
結果是;1073741822