JAVA二進制.位運算.移位運算

二進制、位運算、位移運算

思考題

1、請看下面的代碼段,回答a,b,c,d,e結果是多少?

public static void main(String []args){

int a=1>>2;

int b=-1>>2;

int c=1<<2;

int d=-1<<2;

int e=3>>>2;

//a,b,c,d,e結果是多少

System.out.println("a="+a);//a=0

System.out.println("b="+b);//b=-1

System.out.println("c="+c);//c=4

System.out.println("d="+d);//d=-4

System.out.println("e="+e);//e=0

}

注:">>"代表算術右移,"<<"代表算術左移,">>>"代表邏輯右移

2、請回答在java中,下面的表達式運算的結果是:

~2=?//-3

2&3=? //2

2|3=? //3

~-5=? //4

13&7=? //5

5|4=? //5

-3^3=? //-2

注:"~"代表位取反,"&"代表位與,"|"代表位或,"^"代表位異或

二進制--基本概念

二進制是逢2進位的進位制,0、1是基本算符。

現代的電子計算機技術全部採用的是二進制,因爲它只使用0、1兩個數字符號,非常簡單方便,易於用電子方式實現。計算機內部處理的信息,都是採用二進制數來表示的。二進制(Binary)數用0和1兩個數字及其組合來表示任何數。進位規則是“逢2進1”,數字1在不同的位上代表不同的值,按從右至左的次序,這個值以二倍遞增。

注:1個字節=8位bit,

bit最高位是符號位如:■□□□□□□□黑色方框爲符號位。

符號位0代表正數,1代表負數

二進制--原碼、反碼、補碼

對於有符號的而言:

1、二進制的最高位是符號位:0表示正數,1表示負數

2、正數的原碼、反碼、補碼都一樣

3、負數的反碼=它的原碼符號位不變,其它位取反

4、負數的補碼=它的反碼+1

5、0的反碼,補碼都是0

6、java沒有無符號數,換言之,java中的數都是有符號的

7、在計算機運算的時候,都是以補碼的方式來運算的。

位運算符和移位運算

java中有4個位運算,分別是“按位與&、按位或|、按位異或^,按位取反~”,它們的運算規則是:

按位與&:兩位全爲1,結果爲1

按位或|:兩位有一個爲1,結果爲1

按位異或^:兩位一個爲0,一個爲1,結果爲1

按位取反:0->1,1->0

java中有3個移位運算符:

>>、<<算術右移和算術左移,運算規則:

算術右移:低位溢出,符號位不變,並用符號位補溢出的高位

算術左移:符號位不變,低位補0

>>>邏輯右移,運算規則是:低們溢出,高位補0

計算過程舉例

注意:計算機運算的時候,都是以補碼的方式來運算的,如果補碼計算結果負數,則需要把補碼轉爲原碼

1>>2

1的原碼
00000000 00000000 00000000 00000001
因爲正數的原碼、反碼、補碼都一樣
所以1的補碼
00000000 00000000 00000000 00000001
算數右移2位結果
00000000 00000000 00000000 00000000
所以1>>2=0
推導出1>>n(n>1的正整數) 結果都爲0
-1>>2
-1的原碼
10000000 00000000 00000000 00000001
-1的反碼
11111111 11111111 11111111 11111110
-1的補碼
11111111 11111111 11111111 11111111
算數右移2位結果
11111111 11111111 11111111 11111111
補碼->反碼 :-1
11111111 11111111 11111111 11111110
反碼->原碼
10000000 00000000 00000000 00000001
所以-1>>2=-1

推導出-1>>n(n>1的正整數) 結果都爲-1

3>>>2

3的原碼

00000000 00000000 00000000 00000011

因爲正數的原碼、反碼、補碼都一樣

所以3的補碼

00000000 00000000 00000000 00000011

>>>邏輯右移2位結果爲

00000000 00000000 00000000 00000000
所以3>>>2=0
~2
2的原碼補碼相同
2的補碼
00000000 00000000 00000000 00000010

按位取反~

11111111 11111111 11111111 11111101
因爲第1爲是1,爲負數,所以要-1,其它位取反得原碼結果
-1
11111111 11111111 11111111 11111100
其它位取反
10000000 00000000 00000000 00000011
所以結果爲-3
發佈了49 篇原創文章 · 獲贊 76 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章