簡介
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
用途
- 判斷int型變量a是奇數還是偶數
a&1 = 0 偶數
a&1 = 1 奇數 - 求平均值,比如有兩個int類型變量x、y,首先要求x+y的和,再除以2,但是有可能x+y的結果會超過int的最大表示範圍,所以位運算就派上用場啦。
(x&y)+((x^y)>>1); - 對於一個大於0的整數,判斷它是不是2的幾次方
((x&(x-1))==0)&&(x!=0); - 比如有兩個int類型變量x、y,要求兩者數字交換,位運算的實現方法:性能絕對高效
x ^= y;
y ^= x;
x ^= y; - 求絕對值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
} - 取模運算,採用位運算實現:
a % (2^n) 等價於 a & (2^n - 1) - 乘法運算 採用位運算實現
a * (2^n) 等價於 a << n - 除法運算轉化成位運算
a / (2^n) 等價於 a>> n - 求相反數
(~x+1)
10 a % 2 等價於 a & 1