java中位運算的一點研究

簡介

java位運算是對java中整型數據(byte char short int long)的二進制進行位操作的運算。java二進制最高位是符號位。0爲正,1爲負。主要有與(&只有1&1爲1,其餘爲0),或(|只有0|0爲0,其餘爲1),非(~取反),異或(^相異爲1),有符號左移(<<),有符號右移(>>),無符號右移(>>>)。沒有無符號左移。

舉例

~4
0 0 0 0 0 0 0 0100
1 1 1 1 1 1 1 1011

解碼:先取反碼,再補碼
0 0 0 0 0 0 0 0100
0 0 0 0 0 0 0 0101
結果:-5

有符號右移>>(若正數,高位補0,負數,高位補1)
-4>>2
1 1 1 1 1 1 1 1100 原碼
1 1 1 1 1 1 1 1 右移,最左邊空出兩位按規則負數空位補1
0 0 0 0 0 0 0 0 解碼
0 0 0 0 0 0 0 1 補碼(補碼即最後一位+1)
結果:-1

有符號左移<<(若正數,低位補0,負數,低位補1)
-4<<2
1 1 1 1 1 1 1 1100 原碼
1 1 1 1 1 1 1 0 左移,最右邊空出兩位補0
0 0 0 0 0 0 0 1 解碼
0 0 0 0 0 0 1 0 補碼
結果:-16

無符號右移>>>(不論正負,高位均補0)
-4>>>2
1 1 1 1 1 1 1 1100 原碼
0011 1 1 1 1 1 1 1 右移(由於高位均補0,故>>>後的結果一定是正數)
結果:1073741823

用途

  1. 判斷int型變量a是奇數還是偶數
    a&1 = 0 偶數
    a&1 = 1 奇數
  2. 求平均值,比如有兩個int類型變量x、y,首先要求x+y的和,再除以2,但是有可能x+y的結果會超過int的最大表示範圍,所以位運算就派上用場啦。
    (x&y)+((x^y)>>1);
  3. 對於一個大於0的整數,判斷它是不是2的幾次方
    ((x&(x-1))==0)&&(x!=0);
  4. 比如有兩個int類型變量x、y,要求兩者數字交換,位運算的實現方法:性能絕對高效
    x ^= y;
    y ^= x;
    x ^= y;
  5. 求絕對值
    int abs( int x )
    {
    int y ;
    y = x >> 31 ;
    return (x^y)-y ; //or: (x+y)^y
    }
  6. 取模運算,採用位運算實現:
    a % (2^n) 等價於 a & (2^n - 1)
  7. 乘法運算 採用位運算實現
    a * (2^n) 等價於 a << n
  8. 除法運算轉化成位運算
    a / (2^n) 等價於 a>> n
  9. 求相反數
    (~x+1)
    10 a % 2 等價於 a & 1
發佈了43 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章