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

   

  擼了N久的代碼,可是忽然冒出來個位運算,我就矇蔽了,這是什麼?我是誰?我在幹什麼?我在哪?Rolling on the floor laughing算法

 

1)閒扯

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

位運算其實就是二進制的運算,加減乘除適用於十進制,而位運算就是二進制的運算,可是因爲咱們的運算都是基於十進制來講的,因此會有點繞,略微有點難懂,接下來言歸正傳spa

 

2)關於二進制

   咱們在編碼過程當中應該會了解不少不一樣的進制,除去經常使用的十進制,還有二進制、八進制、十六進制,由於咱們的位運算符主要用到二進制,就只講講二進制3d

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

 

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

image這樣的it

 

 

3) 與運算符(&)  

   若是  4&7   那麼這個應該怎麼運算呢?class

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

     4 : 0000 0100im

     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 / 2n

9無符號右移(>>>)

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

在移動位的時候與右移運算符的移動方式同樣的,區別只在於補位的時候無論是0仍是1,都補0

  這個就不畫圖了

相關文章
相關標籤/搜索