擼了N久的代碼,但是突然冒出來個位運算,我就蒙蔽了,這是什么?我是誰?我在干什么?我在哪?![]()
1)閑扯
關於位運算符無非也就 與(&)、或(|)、異或(^)、取反(~)、左移(<<)、右移(>>)、無符號右移(>>>)
位運算其實就是二進制的運算,加減乘除適用於十進制,而位運算就是二進制的運算,但是由於我們的運算都是基於十進制來說的,所以會有點繞,略微有點難懂,接下來言歸正傳
2)關於二進制
我們在編碼過程中應該會了解很多不同的進制,除去常用的十進制,還有二進制、八進制、十六進制,因為我們的位運算符主要用到二進制,就只講講二進制
幾進制就是一個位上最多能表示幾個數,如十進制的個位有0~9十個數字,八進制有0~7八個數字,二進制我們自然想到就是0~1兩個數字
我們編碼中最小的單位應該是字節,而一個字節有8位,每一位就是一個0或1,所以一個字節用二進制表示就是
3) 與運算符(&)
如果 4&7 那么這個應該怎么運算呢?
首先我們需要把兩個十進制的數轉換成二進制
4 : 0000 0100
7 : 0000 0111
在這里要提到一點,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
在做與運算的時候
遇true(1)就是true(1),
無true(1)就是false(0)
5) 異或運算符(^)
以 7^15 為例
7: 0000 0111
15: 0000 1111
在異或的時候
只要相同都是false(0)
只有不同才是true(1)
6) 取反運算符(~)
例: ~15
同樣的先變成二進制:15:0000 1111
這個其實挺簡單的,就是把1變0,0變1
注意:二進制中,最高位是符號位 1表示負數,0表示正數
7) 左移運算(<<)
左移就是把所有位向左移動幾位
如: 12 << 2 意思就是12向左移動兩位
12的二進制是: 0000 1100
通過這個圖我們可以看出來,所有的位全都向左移動兩位,然后把右邊空的兩個位用0補上,最左邊多出的兩個位去掉,最后得到的結果就是00110000 結果就是48
我們用同樣的辦法算 12<<3 結果是 96
8<<4 結果是 128
由此我們得出一個快速的算法 M << n 其實可以這么算 M << n = M * 2n
8) 右移運算符(>>)
這個跟左移運算大體是一樣的
例: 12 >> 2
我們可以看出來右移和左移其實是一樣的,但是還是有點不同的,不同點在於對於正數和負數補位的時候補的不一樣,負數補1,正數補0
如我們再做一個 –8 的 -8>>2
這里總結一下,關於負數或者正數來說,移位的時候是一樣的,但是在補位的時候,如果最高位是0就補0,如果最高位是1就補1
由此我們得出一個快速的算法 M >> n 其實可以這么算 M >> n = M / 2^n
9無符號右移(>>>)
無符號右移(>>>)只對32位和64位有意義
在移動位的時候與右移運算符的移動方式一樣的,區別只在於補位的時候不管是0還是1,都補0
這個就不畫圖了








