天天看點

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

其它位取反

1 0000000 00000000 00000000 00000011 是以結果為-3

繼續閱讀