前言
雖然位運算在實際開發中並不常用,但是在各種演算法中卻常常見到它們的身影.因為是直接操作二進位制的,所以機器執行起來就快很多,所以儘管實際業務中不常用,但如果你不想只做個碼農,這個基礎還是要掌握的;
講位操作之前,就必須要知道原碼、反碼、補碼
其中正數的原碼=反碼=補碼
原碼、反碼、補碼
在機器的記憶體中,一個負數的表示是這個負數的絕對值取原碼,再取反碼,再加一,最後出現的就是這個負數在記憶體中的表示的二進位制數值
比如說-9在記憶體中的二進位制碼,這裡用8位表示:
最後-9在記憶體中的二進位制值為11110111
在二進位制中,最高位為符號位,0代表正,1代表負**
位運算
左移和右移
在Java
中的int
型別有4位元組,一個位元組有8位,所以這邊用32位表示一個數
負數的左移和右移
這邊負數表示是在記憶體中表示的二進位制值
右移時:最高位補符號位1
左移時:末尾補0
正數的左移和右移
右移時:最高位補符號位0
左移時:末尾補0
無符號右移
無論是正數還是負數,右移最高位一律補0
&(位與)
當相對應的位都為1時,等於1,否則等於0
為了方便表示,接下來全部都用8位表示一個數
|(位或)
當相對應的位有一個為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 |