擼了N久的代碼,可是忽然冒出來個位運算,我就矇蔽了,這是什麼?我是誰?我在幹什麼?我在哪?算法
關於位運算符無非也就 與(&)、或(|)、異或(^)、取反(~)、左移(<<)、右移(>>)、無符號右移(>>>)編碼
位運算其實就是二進制的運算,加減乘除適用於十進制,而位運算就是二進制的運算,可是因爲咱們的運算都是基於十進制來講的,因此會有點繞,略微有點難懂,接下來言歸正傳spa
咱們在編碼過程當中應該會了解不少不一樣的進制,除去經常使用的十進制,還有二進制、八進制、十六進制,由於咱們的位運算符主要用到二進制,就只講講二進制3d
幾進制就是一個位上最多能表示幾個數,如十進制的個位有0~9十個數字,八進制有0~7八個數字,二進制咱們天然想到就是0~1兩個數字blog
咱們編碼中最小的單位應該是字節,而一個字節有8位,每一位就是一個0或1,因此一個字節用二進制表示就是get
若是 4&7 那麼這個應該怎麼運算呢?class
首先咱們須要把兩個十進制的數轉換成二進制 二進制
4 : 0000 0100im
7 : 0000 0111
在這裏要提到一點,1表示true,0表示false
而與運算的時候相同位之間其實就是兩個Boolean的運算
全true(1),即爲true(1)
全false(0),即爲false(0)
一false(0)一true(1),仍是false(0)
以 5|9 爲例
5 : 0000 0101
9 : 0000 1001
在作與運算的時候
遇true(1)就是true(1),
無true(1)就是false(0)
以 7^15 爲例
7: 0000 0111
15: 0000 1111
在異或的時候
只要相同都是false(0)
只有不一樣纔是true(1)
例: ~15
一樣的先變成二進制:15:0000 1111
這個其實挺簡單的,就是把1變0,0變1
注意:二進制中,最高位是符號位 1表示負數,0表示正數
左移就是把全部位向左移動幾位
如: 12 << 2 意思就是12向左移動兩位
12的二進制是: 0000 1100
經過這個圖咱們能夠看出來,全部的位全都向左移動兩位,而後把右邊空的兩個位用0補上,最左邊多出的兩個位去掉,最後獲得的結果就是00110000 結果就是48
咱們用一樣的辦法算 12<<3 結果是 96
8<<4 結果是 128
由此咱們得出一個快速的算法 M << n 其實能夠這麼算 M << n = M * 2n
這個跟左移運算大致是同樣的
例: 12 >> 2
咱們能夠看出來右移和左移實際上是同樣的,可是仍是有點不一樣的,不一樣點在於對於正數和負數補位的時候補的不同,負數補1,正數補0
如咱們再作一個 –8 的 -8>>2
這裏總結一下,關於負數或者正數來講,移位的時候是同樣的,可是在補位的時候,若是最高位是0就補0,若是最高位是1就補1
由此咱們得出一個快速的算法 M >> n 其實能夠這麼算 M >> n = M / 2n
無符號右移(>>>)只對32位和64位有意義
在移動位的時候與右移運算符的移動方式同樣的,區別只在於補位的時候無論是0仍是1,都補0
這個就不畫圖了