本篇文章記錄十六進制表示法,以及與十進制、二進制之間的轉換方法。十進制的數字表示我們日常生活中一直在使用,在計算機中使用二進制表示法。計算機系統中一個使用字節作爲基本的讀寫單位,一個字節由8位組成。
在二進制表示法中,他的值域爲 00000000~11111111 。在十進制中值域則爲 0~255。 這兩種符號表示法對於描述位模式來說都不是非常方便。 二進制表示法太冗長,而十進制表示法與位模式的互相轉化很麻煩。 替代的方法是,以16爲基數,也稱十六進制數 ,來表示位模式。十六進制(簡寫爲“hex”)使用數字 ‘0’ ~ ‘9’ 以及字符 ‘A’ ~ ‘F’ 來表示 16 個可能的值。下圖展示了 16 個 十六進制數字對應的 十進制值 和 二進制值。用十六進制書寫,一個字節的值域爲 00 ~ FF。
十六進制數字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
十進制值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
二進制值 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
在C 語言中,以 0x 或 0X 開頭的數字常量被認爲是十六進制。
編寫機器級程序的一個常見任務就是在位模式 的十進制、二進制、十六進制 表示之間人工轉換。 二進制和十六進制之間的轉換比較簡單直接,因爲可以一次執行一個十六進制數字的轉換。數字的轉換可以參考上面的表格。
下面主要介紹進制之間的轉換方法
二進制與十六進制之間的轉換
比如,假設給你一個數字 0x173A4C。可以通過展示每個十六進制數字,將它轉換爲二進制格式,如下所示:
十六進制 | 1 | 7 | 3 | A | 4 | C |
---|---|---|---|---|---|---|
二進制 | 0001 | 0111 | 0011 | 1010 | 0100 | 1100 |
這樣就得了二進制表示 000101110011101001001100。
反過來如果給定一個二進制數字 1111001010110110110011,可以通過首先把它分爲每 4 位一組來轉換爲十六進制。不過要注意,如果位總數不是 4 的倍數,最左邊的一組可以少於四位,前面用 0 補足。 然後將每個 4 位 組 轉換爲相應的十六進制數字:
二進制 | 11 | 1100 | 1010 | 1101 | 1011 | 0011 |
---|---|---|---|---|---|---|
十六進制 | 3 | C | A | D | B | 3 |
十進制與十六進制之間的轉換
當值 x 是 2 的 非負整數 n 次冪時,也就是 x = 2^n , 這種情況我們很容易將 x 寫成 十六進制 形式,只要記住 x 的二進制 表示 就是 1 後面跟 n 個 0 。十六進制 數字0 表示 4 個二進制 0. 所以,當n表示成 i + 4j 的形式, 其中 0 <= i <= 3 , 我們可以把 x 寫成開頭 的十六進制數字爲 1(i=0)、2(i=1)、4(i=2)或者 8(i=3),後面跟隨者 j 個十六機制的 0 。比如 x=2048=2^11, 我們有 n = 11 = 3 + 4*2, 從而得到十六進制表示 0x800。
十進制和十六進制表示 之間的轉換需要使用乘法或者除法來處理一般情況。 將一個十進制數 x 轉換爲 十六進制,可以反覆地用 16 除 x,得到一個 商 q 和一個餘數 r,也就是 x = q16 + r 。 然後,我們用十六進制數字表示的 r 作爲最低位數字*,並且通過對 q 反覆進行這個過程 得到剩下的數字。 例如,考慮十進制 314156 轉換:
314156=19634*16+12 | C |
---|---|
19634=1227*16+2 | 2 |
1227=76*16+11 | B |
76=4*16+12 | C |
4=16*0+4 | 4 |
從這裏我們能讀出十六進制表示爲 0x4CB2C (最後的餘數爲最高位)。
反過來將一個十六進制數字轉換爲十進制數字,我們可以用相應的16的冪乘以每個十六進制數字。比如,給定數字 0x7AF,我們計算它對應的十進制爲 7 * 16^2 + 10 * 16 + 15 = 1792 + 160 + 15 = 1967。