進制轉換

二進制轉換十進制
二進制數第0位的權值是2的0次方,第1位的權值是2的1次方……
因此,設有一個二進制數:101100100,轉換爲10進製爲:356
用橫式計算
0×2 0+0×21+1×22+0×23+0×24+1×25+1×26+0×27+1×28=356
0乘以多少都是0,因此咱們也能夠直接跳過值爲0的位:
1×2 2+1×25+1×26+1×28=356
4+32+64+256 =356
八進制轉換十進制
八進制就是逢8進1。
八進制數採用 0~7這八數來表達一個數。
八進制數第0位的權值爲8的0次方,第1位權值爲8的1次方,第2位權值爲8的2次方……
因此,設有一個八進制數:1507,轉換爲十進制爲:839,具體方法以下:
能夠用橫式直接計算:
7×8 0+0×81+5×82+1×83=839
也能夠用豎式表示
第0位 7×8 0=7
第1位 0×8 1=0
第2位 5×8 2=320
第3位 1×8 3=512
十六進制轉換十進制
16進制就是逢16進1,但咱們只有0~9這十個數字,因此咱們用A,B,C,D,E,F這六個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。
十六進制數的第0位的權值爲16的0次方,第1位的權值爲16的1次方,第2位的權值爲16的2次方……
因此,在第N(N從0開始)位上,若是是數β (β大於等於0,而且β小於等於 15,即:F)表示的大小爲 β×16的N次方。
假設有一個十六進數 2AF5
直接計算就是:
5×16 0+F×161+A×162+2×163=10997[1] 
也能夠用豎式表示:
第0位: 5×16 0=5
第1位: F×16^1=240
第2位: A×16 2=2560
第3位: 2×16 3=8192
-------------------------------
10997
此處能夠看出,全部進制換算成10進制,關鍵在於各自的權值不一樣。
假設有人問你,十進數1234 爲何是一千二百三十四?你盡能夠給他這麼一個算式:
1234 = 1×10 3+2×102+3×101+4×100
十六進制互相轉換
首先咱們來看一個二進制數:1111,它是多少呢?
你可能還要這樣計算:1×2 0+1×21+1×22+1×23=1×1+1×2+1×4+1×8=15。
然而,因爲1111才4位,因此咱們必須直接記住它每一位的權值,而且是從高位往低位記,:八、四、二、1。即,最高位的 權值爲2 3=8,而後依次是 22=4,21=2,20=1。
記住8421,對於任意一個4位的二進制數,咱們均可以很快算出它對應的10進制值。
下面列出四位二進制數 xxxx 全部可能的值(中間略過部分)
僅4位的2進制數 快速計算方法 十進制值 十六進制
1111 = 8 + 4 + 2 + 1 = 15 =F
1110 = 8 + 4 + 2 + 0 = 14= E
1101 = 8 + 4 + 0 + 1 = 13= D
1100 = 8 + 4 + 0 + 0 = 12 =C
1011 = 8 + 0 + 2 + 1 = 11= B
1010 = 8 + 0 + 2 + 0 = 10 =A
1001 = 8 + 0 + 0 + 1 =9 =9
……
0001 = 0 + 0 + 0 + 1 = 1= 1
0000 = 0 + 0 + 0 + 0 = 0= 0
二進制數要轉換爲十六進制,就是以4位一段,分別轉換爲十六進制。
如(上行爲二制數,下面爲對應的十六進制):
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
反過來,當咱們看到 FD時,如何迅速將它轉換爲二進制數呢?
先轉換F:
看到F,咱們需知道它是15(可能你還不熟悉A~F這五個數),而後15如何用8421湊呢?應該是8 + 4 + 2 + 1,因此四位全爲1 :1111。
接着轉換D
看到D,知道它是13,13如何用8421湊呢?應該是:8 + 4 + 1,即:1101。
因此,FD轉換爲二進制數,爲:1111 1101
因爲 十六進制轉換成二進制至關直接,因此,咱們須要將一個十進制數轉換成2進制數時,也能夠先轉換成16進制,而後再轉換成2進制。
好比,十進制數 1234轉換成二制數,若是要一直除以2,直接獲得2進制數,須要計算較屢次數。因此咱們能夠先除以16,獲得16進制數:
被除數 計算過程 商 餘數
1234 1234/16 77 2
77 77/16 4 13 (D)
4 4/16 0 4
結果16進製爲:4D2
而後咱們可直接寫出4D2的二進制形式:
0100
1101
0010
其中對映關係爲:
0100 -- 4
1101 -- D
0010 -- 2
一樣,若是一個二進制數很長,咱們須要將它轉換成10進制數時,除了前面學過的方法是,咱們還能夠先將這個 二進制轉換成16進制,而後再轉換爲10進制。
下面舉例一個int類型的二進制數:
01101101
11100101
10101111
00011011
咱們按四位一組轉換爲16進制:6D E5 AF 1B
十進制轉十六進制
採餘數定理分解,例如將487710轉成十六進制:
487710÷16=30481....14(E)
30481÷16=1905....1
1905÷16=119....1
119÷16=7....7
7÷16=0....7
這樣就計到487710(10)=7711E(16)

表達方法

程序的表達方法環境 格式備註URL%hex無 XML,XHTML&#xhex無HTML,CSS#hex6位,表示顏色UnicodeU+hex6位,表示字符編碼MIME=hex無Modula-2#hex無Smalltalk,ALGOL 6816rhex無Common Lisp#xhex或#16rhex無IPv68個hex用:分隔無
C C++的表達方法
若是不使用特殊的書寫形式,16進制數也會和10進制相混。隨便一個數:9876,就看不出它是16進制或10進制。
C,C++規定,16進制數必須以 0x開頭。好比 0x1表示一個16進制數。而1則表示一個 十進制。另外如:0xff,0xFF,0X102A,等等。其中的x也不區分大小寫。(注意:0x中的0是數字0,而不是字母O)
如下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
至此,咱們學完了全部進制:10進制,8進制,16進制數的表達方式。最後一點很重要,C/C++中,10進制數有正負之分,好比12表示正12,而-12表示負12,;但8進制和16進制只能表達無符號的正整數,若是你在代碼中寫:-078,或者寫:-0xF2,C,C++並不把它當成一個 負數
在轉義符中的使用
轉義符也能夠接一個16進制數來表示一個字符。如 \'?\' 字符,能夠有如下表達方式:
\'?\' //直接輸入字符
\'\77\' //用八進制,此時能夠省略開頭的0
\'\0x3F\' //用十六進制
一樣,這一小節只用於瞭解。除了空字符用 八進制數 \'\0\' 表示之外,咱們不多用後兩種方法表示一個字符。

各碼轉換

結束了各類進制的轉換,咱們來談談另外一個話題:原碼、反碼、補碼。
咱們已經知道計算機中,全部數據最終都是使用二進制數表達。
咱們也已經學會如何將一個10進制數如何轉換爲二進制數。
不過,咱們仍然沒有學習一個負數如何用二進制表達。
好比,假設有一 int 類型的數,值爲5,那麼,咱們知道它在計算機中表示爲:5
00000000
00000000
00000000
00000101
轉換成二制是101,不過int類型的數佔用4字節(32位),因此前面填了一堆0。
想知道,-5在計算機中如何表示嗎?
在計算機中,負數以其正值的補碼形式表達。
什麼叫補碼呢?這得從原碼,反碼提及。
原碼:一個整數,按照絕對值大小轉換成的二進制數,稱爲原碼。
好比
00000000
00000000
00000000
00000101
是 5的 原碼。
反碼:將二進制數按位取反,所得的新二進制數稱爲原二進制數的反碼。
取反操做指:原爲1,得0;原爲0,得1。(1變0; 0變1)
好比:
00000000
00000000
00000000
00000101
每一位取反,得11111111 11111111 11111111 11111010。
稱:11111111 11111111 11111111 11111010 是
00000000
00000000
00000000
00000101
的反碼。
反碼是相互的,因此也可稱:
11111111
11111111
11111111
11111010
00000000
00000000
00000000
00000101
互爲反碼。
補碼:反碼加1稱爲補碼。
也就是說,要獲得一個數的補碼,先獲得反碼,而後將反碼加上1,所得數稱爲補碼。
好比:
00000000
00000000
00000000
00000101
的反碼是:
11111111
11111111
11111111
11111010
那麼,補碼爲:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
因此,-5 在計算機中表達爲:11111111 11111111 11111111 11111011。轉換爲十六進制:0xFFFFFFFB。
再舉一例,咱們來看整數-1在計算機中如何表示。
假設這也是一個int類型,那麼:
一、先取1的原碼:
00000000
00000000
00000000
00000001
二、得反碼:
11111111
11111111
11111111
11111110
三、得補碼:
11111111
11111111
11111111
11111111
可見,-1在計算機裏用二進制表達就是全1。16進製爲:0xFFFFFFFF。
一切都是紙上說的……說-1在計算機裏表達爲0xFFFFFFFF,我能不能親眼看一看呢?固然能夠。利用C++ Builder的調試功能,咱們能夠看到每一個變量的16進制值。

變量

下面咱們來動手完成一個小小的實驗,經過調試,觀察變量的值。
咱們在代碼中聲明兩個int 變量,並分別初始化爲5和-5。而後咱們經過CB提供的調試手段,能夠查看到程序運行時,這兩個變量的十進制值和十六進制值。
首先寫一個以下的C語言控制檯程序:
1
2
3
4
5
intmain( void )
{
intaaaa=5,bbbbb=-5;
return0;
}
設置斷點:最經常使用的調試方法之一,使程序在運行時,暫停在某一代碼位置,
在Code::Blocks中,設置斷點的方法是在某一行代碼上按F5或在行首欄內單擊鼠標。
咱們在return 0;這一行上設置斷點。斷點所在行將被Code::Blocks以紅色顯示。
接着,運行程序(F9),程序將在斷點處停下來。
(請注意兩張圖的不一樣,前面的圖是運行以前,後面這張是運行中,左邊的箭頭表示運行運行到哪一行)
當程序停在斷點的時,咱們能夠觀察當前代碼片斷內,可見的變量。觀察變量的方法不少種,這裏咱們學習使用 Debug Inspector (調試期檢視),來全面觀察一個變量。
如下是調出觀察某一變量的 Debug Inspector 窗口的方法:
先確保代碼窗口是活動窗口。(用鼠標點一下代碼窗口)
按下Ctrl鍵,而後將鼠標挪到變量 aaaa 上面,你會發現代碼中的aaaa變藍,而且出現下劃線,效果如網頁中的超連接,而鼠標也變成了小手狀:
點擊鼠標,將出現變量aaaa的檢視窗口。
從該窗口,我能夠看到:
aaaa :變量名
int :變量的數據類型
0012FF88:變量的 內存地址,請參看5.2 變量與內存地址;地址老是使用十六進制表達
5 :這是變量的值,即aaaa = 5;
0x00000005 :一樣是變量的值,但採用16進製表示。由於是int類型,因此佔用4字節。
首先先關閉前面的用於觀察變量aaaa的Debug Inspector窗口。
而後,咱們用一樣的方法來觀察變量bbbb,它的值爲-5,負數在計算機中使用補碼錶示。
正如咱們所想,-5的補碼爲:0xFFFFFFFB。
再按一次F9,程序將從斷點繼續運行,而後結束。

總結

很難學的一章?
來看看咱們主要學了什麼:
一、咱們學會了如何將2、8、十六進制數轉換爲十進制數。
三種轉換方法是同樣的,都是使用乘法。
二、咱們學會了如何將十進制數轉換爲2、8、十六進制數。
方法也都同樣,採用除法。
三、咱們學會了如何快速的地互換二進制數和十六進制數。
要訣就在於對二進制數按四位一組地轉換成十六進制數。
在學習十六進制數後,咱們會在不少地方採用十六進制數來替代二進制數。
四、咱們學習了原碼、反碼、補碼。
把原碼的0變1,1變0,就獲得反碼。要獲得 補碼,則先得 反碼,而後加1。
之前咱們只知道正整數在計算機裏是如何表達,這時咱們還知道負數在計算機裏使用其絕對值的補碼錶達。
好比,-5在計算機中如何表達?回答是:5的補碼。
五、最後咱們在上機實驗中,這會了如何設置斷點,如何調出Debug Inspector窗口觀察變量。
之後咱們會學到更多的調試方法。

標準表示

在數制使用時,常將各類數制用簡碼來表示:如十進制數用D表示或省略;二進制用B來表示;十六進制數用H來表示。
如:十制數123表示爲:123D或者123;二進制數1011表示爲:1011B;十六進制數3A4表示爲:3A4H。
另外在編程中十六進制數也用「0x」做爲開頭。

意義

  1. 用於計算機領域的一種重要的數制。
  2. 對計算機理論的描述,計算機硬件電路的設計都是頗有益的。好比邏輯電路設計中,既要考慮功能的完備,還要考慮用盡量少的硬件,十六進制就能起到一些理論分析的做用。好比四位 二進制電路,最多就是十六種狀態,也就是一種十六進制形式,只有這十六種狀態都被用上了或者儘量多的被用上,硬件資源才發揮了儘量大的做用。
  3. 十六進制更簡短,由於換算的時候一位16進制數能夠頂4位2進制數。
  4. 你能夠在二進制前加幾個0,意義不變。
二進制
八進制
十進制
十六進制
0
1
0
1
0
1
0
1
10
2
2
2
11
3
3
3
100
4
4
4
101
5
5
5
110
6
6
6
111
7
7
7
1000
10
8
8
1001
11
9
9
1010
12
10
A
1011
13
11
B
1100
14
12
C
1101
15
13
D
1110
16
14
E
1111
17
15
F
10000
20
16
10
10001
21
17
11
10010
22
18
12
10011
23
19
13
10100
24
20
14
10101
25
21
15
10110
26
22
16
10111
27
23
17
11000
30
24
18
11001
31
25
19
11010
32
26
1A
11011
33
27
1B
11100
34
28
1C
11101
35
29
1D
11110
36
30
1E
11111
37
31
1F
100000
40
32
20
100001
41
33
21
100010
42
34
22
100011
43
35
23
100100
44
36
24
100101
45
37
25
100110
46
38
26
100111
47
39
27
101000
50
40
28
101001
51
41
29
101010
52
42
2A
101011
53
43
2B
101100
54
44
2C
101101
55
45
2D
101110
56
46
2E
101111
57
47
2F
110000
60
48
30
110001
61
49
31
110010
62
50
32
110011
63
51
33
110100
64
52
34
110101
65
53
35
110110
66
54
36
110111
67
55
37
111000
70
56
38
111001
71
57
39
111010
72
58
3A
111011
73
59
3B
111100
74
60
3C
111101
75
61
3D
111110
76
62
3E
111111
77
63
3F
1000000
100
64
40
1000001
101
65
41
1000010
102
66
42
1000011
103
67
43
1000100
104
68
44
1000101
105
69
45
1000110
106
70
46
1000111
107
71
47
1001000
110
72
48
1001001
111
73
49
1001010
112
74
4A
1001011
113
75
4B
1001100
114
76
4C
1001101
115
77
4D
1001110
116
78
4E
1001111
117
79
4F
1010000
120
80
50
1010001
121
81
51
1010010
122
82
52
1010011
123
83
53
1010100
124
84
54
1010101
125
85
55
1010110
126
86
56
1010111
127
87
57
1011000
130
88
58
1011001
131
89
59
1011010
132
90
5A
1011011
133
91
5B
1011100
134
92
5C
1011101
135
93
5D
1011110
136
94
5E
1011111
137
95
5F
1100000
140
96
60
1100001
141
97
61
1100010
142
98
62
1100011
143
99
63
1100100
144
100
64

進位制的記數系統

基本進位制
 二進制  三進制  四進制  五進制
 六進制  七進制  八進制  九進制
 十進制  十一進制  十二進制  十三進制
 十四進制  十五進制  十六進制  十八進制
 二十進制  二十四進制  二十六進制  二十七進制
 三十進制  三十二進制  三十六進制  六十進制
 六十四進制      
 
平衡進位制
 平衡三進制  平衡五進制  平衡九進制  
 
特殊進位制
 Base64  十進位制  二進指數法  黃金進制
 斐波那契編碼  e進制    
 
相關條目
   位元  進位制  米迪定理
 記數系統
相關文章
相關標籤/搜索