Java 位運算符 &、|、^、~、<<、>>、>>>


   

  擼了N久的代碼,但是突然冒出來個位運算,我就蒙蔽了,這是什么?我是誰?我在干什么?我在哪?Rolling on the floor laughing

 

1)閑扯

關於位運算符無非也就 與(&)、或(|)、異或(^)、取反(~)、左移(<<)、右移(>>)、無符號右移(>>>)

位運算其實就是二進制的運算,加減乘除適用於十進制,而位運算就是二進制的運算,但是由於我們的運算都是基於十進制來說的,所以會有點繞,略微有點難懂,接下來言歸正傳

 

2)關於二進制

   我們在編碼過程中應該會了解很多不同的進制,除去常用的十進制,還有二進制、八進制、十六進制,因為我們的位運算符主要用到二進制,就只講講二進制

   幾進制就是一個位上最多能表示幾個數,如十進制的個位有0~9十個數字,八進制有0~7八個數字,二進制我們自然想到就是0~1兩個數字

 

   我們編碼中最小的單位應該是字節,而一個字節有8位,每一位就是一個0或1,所以一個字節用二進制表示就是

image這樣的

 

 

3) 與運算符(&)  

   如果  4&7   那么這個應該怎么運算呢?

     首先我們需要把兩個十進制的數轉換成二進制 

     4 : 0000 0100

     7 : 0000 0111

image

 

在這里要提到一點,1表示true,0表示false

而與運算的時候相同位之間其實就是兩個Boolean的運算

                     全true(1),即為true(1)

                     全false(0),即為false(0)

                     一false(0)一true(1),還是false(0)

 

 

4)或運算符(|)

   以   5|9   為例

 

   5 : 0000 0101 

   9 : 0000 1001

image

在做與運算的時候

                 遇true(1)就是true(1),

                 無true(1)就是false(0)

 

5) 異或運算符(^)

           以 7^15 為例

           7:   0000 0111

           15: 0000 1111

image

在異或的時候

               只要相同都是false(0)

               只有不同才是true(1)

 

6) 取反運算符(~)

        例:   ~15

        同樣的先變成二進制:15:0000 1111

image

      這個其實挺簡單的,就是把1變0,0變1

注意:二進制中,最高位是符號位   1表示負數,0表示正數

 

7) 左移運算(<<)

      左移就是把所有位向左移動幾位

    如:   12 << 2    意思就是12向左移動兩位

          12的二進制是: 0000 1100

image

 

通過這個圖我們可以看出來,所有的位全都向左移動兩位,然后把右邊空的兩個位用0補上,最左邊多出的兩個位去掉,最后得到的結果就是00110000  結果就是48

我們用同樣的辦法算 12<<3  結果是 96

                            8<<4  結果是  128

  由此我們得出一個快速的算法    M << n   其實可以這么算   M << n  = M * 2n

 

8) 右移運算符(>>)

 

這個跟左移運算大體是一樣的

     例: 12 >> 2

image

 

我們可以看出來右移和左移其實是一樣的,但是還是有點不同的,不同點在於對於正數和負數補位的時候補的不一樣,負數補1,正數補0

如我們再做一個 –8 的    -8>>2

 

image

 

這里總結一下,關於負數或者正數來說,移位的時候是一樣的,但是在補位的時候,如果最高位是0就補0,如果最高位是1就補1

由此我們得出一個快速的算法    M >> n   其實可以這么算   M >> n  = M / 2^n

9無符號右移(>>>)

     無符號右移(>>>)只對32位和64位有意義

在移動位的時候與右移運算符的移動方式一樣的,區別只在於補位的時候不管是0還是1,都補0

  這個就不畫圖了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM