二進制轉換十進制
二進制數第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
直接計算就是:
也可以用豎式表示:
第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位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、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÷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、先取1的原碼:
|
00000000
|
00000000
|
00000000
|
00000001 |
2、得反碼:
|
11111111
|
11111111
|
11111111
|
11111110
|
3、得補碼:
|
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,程序將從斷點繼續運行,然后結束。
總結
很難學的一章?
來看看我們主要學了什么:
1、我們學會了如何將二、八、十六進制數轉換為十進制數。
三種轉換方法是一樣的,都是使用乘法。
2、我們學會了如何將十進制數轉換為二、八、十六進制數。
方法也都一樣,采用除法。
3、我們學會了如何快速的地互換二進制數和十六進制數。
要訣就在於對二進制數按四位一組地轉換成十六進制數。
在學習十六進制數后,我們會在很多地方采用十六進制數來替代二進制數。
4、我們學習了原碼、反碼、補碼。
以前我們只知道正整數在計算機里是如何表達,這時我們還知道負數在計算機里使用其絕對值的補碼表達。
比如,-5在計算機中如何表達?回答是:5的補碼。
5、最后我們在上機實驗中,這會了如何設置斷點,如何調出Debug Inspector窗口觀察變量。
以后我們會學到更多的調試方法。
標准表示
在數制使用時,常將各種數制用簡碼來表示:如十進制數用D表示或省略;二進制用B來表示;十六進制數用H來表示。
如:十制數123表示為:123D或者123;二進制數1011表示為:1011B;十六進制數3A4表示為:3A4H。
另外在編程中十六進制數也用“0x”作為開頭。
意義
-
用於計算機領域的一種重要的數制。
-
對計算機理論的描述,計算機硬件電路的設計都是很有益的。比如邏輯電路設計中,既要考慮功能的完備,還要考慮用盡可能少的硬件,十六進制就能起到一些理論分析的作用。比如四位 二進制電路,最多就是十六種狀態,也就是一種十六進制形式,只有這十六種狀態都被用上了或者盡可能多的被用上,硬件資源才發揮了盡可能大的作用。
-
十六進制更簡短,因為換算的時候一位16進制數可以頂4位2進制數。
-
你可以在二進制前加幾個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
|

