位與&(真真爲真 真假爲假 假假爲假)
4&6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0100
結果:4性能
位或|(真真爲真 真假爲真 假假爲假)
4|6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0110
結果:6spa
位非~(取反碼)【注:Java中正數的最高位爲0,負數最高位爲1,即最高位決定正負符號】
~4
0000 0000 0000 0000 0000 0000 0000 0100
1111 1111 1111 1111 1111 1111 1111 1011變量
解碼:先取反碼,再補碼
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101
結果:-5數據類型
位異或^(真真爲假 真假爲真 假假爲假)
4^6
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 0000 0010
結果:2方法
有符號右移>>(若正數,高位補0,負數,高位補1)
-4>>2
1111 1111 1111 1111 1111 1111 1111 1100 原碼
1111 1111 1111 1111 1111 1111 1111 1111 右移,最左邊空出兩位按規則負數空位補1
0000 0000 0000 0000 0000 0000 0000 0000 解碼
0000 0000 0000 0000 0000 0000 0000 0001 補碼(補碼即最後一位+1)
結果:-1數據
有符號左移<<(若正數,高位補0,負數,高位補1)
-4<<2
1111 1111 1111 1111 1111 1111 1111 1100 原碼
1111 1111 1111 1111 1111 1111 1111 0000 左移,最右邊空出兩位補0
0000 0000 0000 0000 0000 0000 0000 1111 解碼
0000 0000 0000 0000 0000 0000 0001 0000 補碼
結果:-16co
無符號右移>>>(不論正負,高位均補0)
-4>>>2
1111 1111 1111 1111 1111 1111 1111 1100 原碼
0011 1111 1111 1111 1111 1111 1111 1111 右移(因爲高位均補0,故>>>後的結果必定是正數)
結果:1073741823數字
注:位運算
因爲數據類型所佔字節是有限的,而位移的大小卻能夠任意大小,因此可能存在位移後超過了該數據類型的表示範圍,因而有了這樣的規定:return
若是爲int數據類型,且位移位數大於32位,則首先把位移位數對32取模,否則位移超過總位數沒意義的。因此4>>32與4>>0是等價的。
若是爲long類型,且位移位數大於64位,則首先把位移位數對64取模,若沒超過64位則不用對位數取模。
若是爲byte、char、short,則會首先將他們擴充到32位,而後的規則就按照int類型來處理
使用場景:
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