十一、進位制
1、進位制介紹
進位制:指進位制,是人們規定的一種進位方式
常見進位制:二進位制、八進位制、十進位制、十六進位制
十進位制是逢十進一,二進位制就是逢二進一,八進位制是逢八進一…
常見進位制:二進位制,八進位制,十進位制,十六進位制
2、二進位制
介紹:二進位制資料是0和1兩個數碼來表示。例如:00101000。
進位規則是“逢二進一”,借位規則是“借一當二”。
3、十進位制
4、八進位制和十六進位制
-
八進位制介紹:採用0,1,2,3,4,5,6,7八個數字,逢八進1
-
十六進位制介紹:用數字0到9和字母A到F(或af)表示,其中:AF表示10~15,這些稱作十六進位制。
【0】【1】【2】【3】【4】【5】【6】【7】【8】【9】【a】【b】【c】【d】【e】【f】
5、不同進制書寫
10 十進位制,不進行修飾
0b1000 1100 二進位制,用0b修飾
077 八進位制,用0修飾
0xf102a 十六進位制,用0x修飾
6、任意進位制轉十進位制
- 公式:係數 * 基數的權次冪 相加
- 係數:每一【位】上的數
- 基數:幾進位制,就是幾
- 權從數值的右側,以 0 開始,逐個 +1 增加
二進位制轉十進位制
十六進位制轉十進位制
7、十進位制轉任意進位制
- 公式:除基取餘
使用源資料,不斷的除以基礎(幾進位制,基數就是幾)得到餘數,直到商為0,再將餘數倒著拼起來即可。
十進位制轉二進位制
十進位制轉十六進位制
8、快速進位制轉換法
8.1、8421碼
8.2、二進位制快速轉十進位制
8.2、二進位制快速轉八進位制
8.4、二進位制快速轉十六進位制
9、原碼反碼補碼
9.1、介紹
注意:計算機中的資料,都是以二進位制補碼的形式在運算,二補碼則是通過反碼和原碼推算出來的
-
原碼(可直觀看出資料大小)
就是二進位制定點表示法,即最高為符號位,【0】表示正,【1】表示負,其餘位表示數值的大小。
通過一個位元組表示 +7 和 -7,程式碼:
byte b1= 7
;byte b2 = -7
;一個位元組等於8個位元位,也就是8個二進位制位
0(符號位) 0000111
1(符號位) 0000111
-
反碼:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
-
補碼(資料以該狀態進行運算)
正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1
總結:
- 正數的原反補都是相同的
- 負數的【反碼】,是根據【原碼】取反(0變1,1變0)得到的。(符號位不變)
- 負數的【補碼】,是根據【反碼】的末尾+1,得到的
9.2、求 -7 的補碼
10、位運算
10.1、位運算介紹
- 位運算子指的是二進位制位的運算,先將十進位制數轉成二進位制後在進行運算
- 在二進位制位運算中,1表示 true,0表示 false。
符號 | 計算方式 |
---|---|
& 與 | 遇0則0;兩邊同時為1,結果才是1 |
| 或 | 遇1則1;兩邊同時為0,結果才是0 |
^ 異或 | 相同為0,不同為1 |
~ 取反 | 取反,二進位制位全部取反,0變1,1變0,包括符號位 |
<< | 有符號左移運算,左邊符號位丟棄,右邊補齊0 |
>> | 有符號右移運算,根據符號位,補齊左邊 |
>>> | 無符號右移,無論最符號位是0還是1,都補0 |
10.2、異或運算的特點
一個數,被另外一個數,異或兩次,該數本身不變
案例:
已知兩個整數變數a = 10,b=20,使用程式實現這兩個變數的資料交換,不允許使用三方變數
public static void main(String[] args){
int a = 10;
int b = 20;
a = a ^ b; // a = 10 ^ 20;
b = a ^ b; // b = 10 ^ 20 ^ 20;
a = a ^ b; // a = 10 ^ 20 ^ 10;
System.out.println(a);
System.out.println(b);
}
案例:陣列反轉
int[] arr = {19,25,36,47,58};
int temp;
for(int start = 0,end = arr.length-1 ; start<end ; start++,end--){
arr[start] = arr[end] ^ arr[start];
arr[end] = arr[start] ^ arr[end];
arr[start] = arr[start] ^ arr[end];
}
System.out.println(Arrays.toString(arr));