二進位制的基本概念
二進位制是逢2進位的進位制,0、1是基本算符。
現代的電子計算機技術全部採用的是二進位制,因為它只使用0、1兩個數字符號,非常簡單方便,易於用電子方式實現。計算機內部處理的資訊,都是採用二進位制數來表示的。二進位制(Binary)數用0和1兩個數字及其組合來表示任何數。進位規則是“逢2進1”,數字1在不同的位上代表不同的值,按從右至左的次序,這個值以二倍遞增。
注:1個位元組=8位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
按位取反:0->1,1->0
移位運算
java中有3個移位運算子:
>>、<<算術右移和算術左移,運算規則:
算術右移:低位溢位,符號位不變,並用符號位補溢位的高位
算術左移:符號位不變,低位補0
>>>邏輯右移,運算規則是:低們溢位,高位補0
程式碼例項
public class test1 {
public static void main(String[] args) {
System.out.println("移位運算結果如下:");
int a = 1 >> 2;
int b = -1 >> 2;
int c = 1 << 2;
int d = -1 << 2;
int e = 3 >>> 2;
System.out.println("1 >> 2:"+a);
System.out.println("-1 >> 2:"+b);
System.out.println("1 << 2:"+c);
System.out.println("-1 << 2:"+d);
System.out.println("3 >>> 2:"+e);
System.out.println("---------------------------");
System.out.println("位運算結果如下");
System.out.println("~2:"+(~2));
System.out.println("2&3:"+(2&3));
System.out.println("2|3:"+(2|3));
System.out.println("-3^3:"+(-3^3));
}
}
計算過程
注意:計算機運算的時候,都是以補碼的方式來運算的,如果補碼計算結果負數,則需要把補碼轉為原碼
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
本作品採用《CC 協議》,轉載必須註明作者和本文連結