Java中的位運算

要搞清楚移位運算,首先要搞清楚字節數。Jvm保證了原始類型的字節數不受操作系統影響,無論是16位,32位或64位操作系統。
boolean 1 位,char 16 位 我們常說的一個字符佔兩個字節,byte 8 位 即一個字節short 16 位,int 32 位,long 64 位,float 32 位,double 64 位。
一般數值都是帶符號的,從左往右數,數值類型的第一位是表示正負的,0爲正1爲負。

*要獲得一個負數的二進制表示:用正數值按位取反再加一(注意這裏的加一不是負數計算中的加一,就是正數的加一)表示負數值。例如int i=1;實際上就是:
0….00001(int是32位,前面有31個0),而-1實際上是1按位取反::1….11110(31個1)::再加一::1….1111(32個1)
*要獲得一個負數形式的二進制表示的十進制值,也是除了第一位符號位外其它位都按位取反再加一,然後加上負號。

弄清楚了各種類型的字節數已經正負符號,所有的位運算操作符就變得簡單了。

一、按位運算:對二進制位(bit)進行布爾代數,並得到結果。

  1. 按位運算一般來說只處理整數。(short,int,long)。如果一個小類型與一個大類型運算,小類型自動補齊大類型所需要的位數。
  2. &兩個bit都是1,則結果是1,否則都是0。-1&1=1
  3. |兩個bit都是0,則結果是0,否則都是1。-1|1=-1
  4. 異或^兩個bit不一樣,則結果是1,否則是0。-1^1=-2
  5. 非~,只對一個bit進行運算。~-1=0

二.移位運算 將二進制向一個方向移動給出的位數。

  1. a<<2,表示將a的二進制表示向左移動兩位,低位補0。在沒移出去的情況下(要是int類型左移32,那就完全移出去了,得到32個0),左移一位表示乘以2。
  2. a>>10表示向右移動十位,若a爲正,則高位補0,若爲負則補1。 右移不存在移出去的問題,右移就表示除以2取整。
  3. >>>無論正負高位都補0。

位運算可以用來做Hash
static int hash(int paramInt)
{
paramInt ^= paramInt >>> 20 ^ paramInt >>> 12;
return (paramInt ^ paramInt >>> 7 ^ paramInt >>> 4);
}
現在應該能看懂這個hash函數在幹嘛了吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章