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碼
- 8421碼又稱BCD碼,是BCD碼中最常用的一種
- BCD: (Binary-Coded Decimal) 二進制碼十進制數
- 在這中編碼方式中,每一位二進制值的1都是代表一個固定數值,把每一位的1代表的十進制數加起來得到的結果就是它所代表的十進制數。
8.2、二進制快速轉十進制
8.2、二進制快速轉八進制
-
八進制:將三個二進制位看為一組,在進行轉換
-
原因:八進制逢八進一,三個二進制位最多可以表示111,也就是7,如果出現第四位,就超范圍了
-
需求:將60的二進制 0b111100 轉換為八進制
8.4、二進制快速轉十六進制
-
十六進制:將四個二進制位看為一組,在進行轉換
-
原因:十六進制逢十六進一,四個二進制位最多可以表示1111,也就是15,如果出現第五位,就超范圍了
-
需求:將60的二進制 0b111100 轉換為十六進制
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));