注:若是得出的結果爲負數,須要取負數的補碼。java
取補碼的過程爲對負數除了符號位進行取反,再加1。spa
5&-3=5
-3====10000011
-3反碼11111100
-3補碼11111101
5==00000101
5&-3==00000101=5二進制
5|-3=-3
-3====10000011
-3反碼11111100
-3補碼11111101
5==00000101
5|-3==11111101結果爲負數求補碼
先反碼10000010
再補碼10000011=-3位運算
15^-2=-15
-2=10000010
先反碼11111101
再補碼11111110
15=00001111
15^-2=11110001
先反碼10001110
再補碼10001111
15^-2=-15運算符
~2=-3
2=00000010
~2=11111101
先反碼10000010
再補碼10000011=-3
~-2=1
-2=10000010
先反碼11111101
再補碼11111110
~-2=00000001=1
java中有三種移位運算符
>>表示右移,若是該數爲正,則高位補0,若爲負數,則高位補1(所有補1);
>>>表示無符號右移,也叫邏輯右移,即若該數爲正,則高位補0,而若該數爲負數,則右移後高位一樣補0。
1)res = 20 >> 2;
20的二進制爲 0001 0100,右移2位後爲 0000 0101,則結果就爲 res = 5;
2)res = -20 >> 2;
-20 == 1001 0100
補碼==1110 1100
右移2位後爲 11111011
補碼==10000101 結果爲 res = -5;
3)而對於>>>符號而言:
res = 20 >>> 2; 的結果與 >> 相同;
4)res = -20 >> 2;???
-20的二進制爲 1110 1011,右移2位,此時高位補0,即 0011 1010,結果爲 res = 1073741819;
5)res = 20 << 2;
20== 0001 0100
01010000 = 80
6)res = -20 << 2;
結果爲 res = -80;
1000 0001 0100 -20
1111 1110 1100 -20補碼
1111 1011 00001000 0101 0000 -80