位運算符

注:若是得出的結果爲負數,須要取負數的補碼。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位運算

負數按補碼形式參加異或運算:^ 相同返回0,不一樣返回1

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

相關文章
相關標籤/搜索