雖然位運算在實際開發中並不經常使用,可是在各類算法中卻經常見到它們的身影.由於是直接操做二進制的,因此機器執行起來就快不少,因此儘管實際業務中不經常使用,但若是你不想只作個碼農,這個基礎仍是要掌握的;算法
講位操做以前,就必需要知道原碼、反碼、補碼
spa
其中正數的
原碼=反碼=補碼
在機器的內存中,一個負數的表示是
這個負數的絕對值取原碼,再取反碼,再加一
,最後出現的就是這個負數在內存中的表示的二進制數值
好比說-9在內存中的二進制碼,這裏用8位表示:code
最後-9在內存中的二進制值爲11110111
blog
在二進制中,最高位爲符號位,
0表明正,1表明負
在Java
中的int
類型有4字節
,一個字節有8位
,因此這邊用32位表示一個數內存
這邊負數表示是在內存中表示的二進制值
右移時:最高位
補符號位1
開發左移時:末尾補0rem
右移時:最高位補符號位0
左移時:末尾補0it
不管是正數仍是負數,右移
最高位一概補0
當相對應的位都爲1時,等於1,不然等於0
爲了方便表示,接下來所有都用8位表示一個數table
當相對應的位有一個爲1時,等於1,不然等於0
當相對應的位不一樣時,等於1,相同時等於0
1等於0,0等於1
含義 | 運算符 | 說明 |
---|---|---|
左移 | << | 末尾補0 |
右移 | >> | 負數:最高位補符號位1 正數:最高位補符號位0 |
無符號右移 | >>> | 不管是正數仍是負數,右移最高位一概補0 |
&(位與) | & | 當相對應的位都爲1時,等於1,不然等於0 |
丨(位或) | 丨 | 當相對應的位有一個爲1時,等於1,不然等於0 |
^(異或) | ^ | 當相對應的位 不一樣時,等於1 相同時,等於0 |
~(取反) | ~ | 1等於0,0等於1 |