Java 邏輯運算符、位運算符、移位操作符 總結 作者:王可利(Star·星星)
邏輯運算符,表格如下:
解析邏輯運算符表:
特點:兩個都為真的時候,結果為真。兩個為假的時候,結果為假。如果存在一個是假的,結果都為假的。
特點:兩個都為真的時候,結果為真。兩個都為假的時候都是假的。如果存在一個是真的,結果都為真的。
特點:異,表示不一樣的意思。所以兩個判斷都是一樣的情況下,結果為假。兩個判斷結果都是不一樣的情況下,結果為真的。
特點:取非,如果是真的,那麼結果就為假的。如果是假的,那麼結果就為真的。
特點:
在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。
負數表示
負數對應的正數的二進制-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 << 2 = 12 --> 3*2*2=12
>>
右移
3 >> 1 = 1 --> 3/2=1
>>>
無符號右移
3 >>> 1 = 1 --> 3/2=1
&
與運算
6 & 3 = 2
|
或運算
6 | 3 = 7
^
異或運算
6 ^ 3 = 5
~
反碼
~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的位移個數次冪.
2、右移
6>>2
00000000
00000000
00000000
00000110
6的二進制
000000
00000000
00000000
00000001
右移10被砍掉
00000000
00000000
00000000
00000001
高位補0
結果是1,所以6>>2 = 1;
結論:右移兩位就是除以 2的2次方,右移一位就是除以 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