二進制、位運算、位移運算
思考題
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>>n(n>1的正整數) 結果都爲-1
3>>>2
3的原碼
00000000 00000000 00000000 00000011
因爲正數的原碼、反碼、補碼都一樣
所以3的補碼
00000000 00000000 00000000 00000011
>>>邏輯右移2位結果爲
按位取反~