十六進制 及進制間的轉換

舉例說明

16進制的20表示成10進制就是:2×16¹+0×16º=32
10進制的32表示成16進制就是:20
十進制數可以轉換成十六進制數的方法是:十進制數的整數部分“除以16取餘”,十進制數的小數部分“乘16取整”,進行轉換。
比如說十進制的0.1轉換成八進制爲0.0631463146314631。就是0.1乘以8=0.8,不足1不取整,0.8乘以8=6.4,取整數6, 0.4乘以8=3.2,取整數3,依次下算。
編程中,我們常用的還是10進制.畢竟C/C++是高級語言。
比如
int a = 100,b = 99;
不過,由於數據在計算機中的表示,最終以二進制的形式存在,所以有時候使用二進制,可以更直觀地解決問題。但二進制數太長了。比如int 類型佔用4個字節,32位。比如100,用int類型的二進制數表達將是:
0000
0000
0000
0000
0110
0100
面對這麼長的數進行思考或操作,沒有人會喜歡。因此,C,C++ 沒有提供在代碼直接寫二進制數的方法。用16進制或8進制可以解決這個問題。因爲,進制越大,數的表達長度也就越短。不過,爲什麼偏偏是16或8進制,而不其它的,諸如9或20進制呢?2、8、16,分別是2的1次方、3次方、4次方。這一點使得三種進制之間可以非常直接地互相轉換。8進制或16進制縮短了二進制數,但保持了二進制數的表達特點。在下面的關於進制轉換的課程中,你可以發現這一點。

3轉換

二進制轉換十進制
二進制數第0位的權值是2的0次方,第1位的權值是2的1次方……
所以,設有一個二進制數:101100100,轉換爲10進製爲:356
用橫式計算
0×20+0×21+1×22+0×23+0×24+1×25+1×26+0×27+1×28=356
0乘以多少都是0,所以我們也可以直接跳過值爲0的位:
1×22+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×80+0×81+5×82+1×83=839
也可以用豎式表示
第0位 7×80=7
第1位 0×81=0
第2位 5×82=320
第3位 1×83=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×160+F×161+A×162+2×163=10997[1] 
也可以用豎式表示:
第0位: 5×160=5
第1位: F×16^1=240
第2位: A×162=2560
第3位: 2×163=8192
-------------------------------
10997
此處可以看出,所有進制換算成10進制,關鍵在於各自的權值不同。
假設有人問你,十進數1234 爲什麼是一千二百三十四?你儘可以給他這麼一個算式:
1234 = 1×103+2×102+3×101+4×100
十六進制互相轉換
首先我們來看一個二進制數:1111,它是多少呢?
你可能還要這樣計算:1×20+1×21+1×22+1×23=1×1+1×2+1×4+1×8=15。
然而,由於1111才4位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、1。即,最高位的權值爲23=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)

4表達方法

程序的表達方法環境 格式備註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\' 表示以外,我們很少用後兩種方法表示一個字符。

5各碼轉換

結束了各種進制的轉換,我們來談談另一個話題:原碼、反碼、補碼。
我們已經知道計算機中,所有數據最終都是使用二進制數表達。
我們也已經學會如何將一個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進制值。

意義

  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
。。。。。。。。。。。。。。。。。。。。。。。。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章