二進制、位運算、位移運算
思考題
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