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
<< 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、右移

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