16.2 二進制與十六進制
二進制對電腦友善,對人類就辛苦了:3072 十進制只要 4 位,二進制卻是 (110000000000)_2——一長串 0 與 1,讀寫都容易眼花。工程師的解法是找一個「跟二進制無縫換算」的縮寫進制:十六進制(hexadecimal)。
十六進制滿 16 進位,每格放 0 \sim 15。10 \sim 15 就用上一節說的字母慣例:
| 字元 | A |
B |
C |
D |
E |
F |
|---|---|---|---|---|---|---|
| 數值 | 10 | 11 | 12 | 13 | 14 | 15 |
¶4 個二進制位=1 個十六進制位
十六進制被選中的原因藏在 2^4 = 16 這條等式裡:4 個二進制位總共有 16 種組合,恰好一一對應十六進制的 16 種數字。所以二進制從右往左每 4 位分一組,每組直接查表換成 1 個十六進制位,反方向也一樣逐位展開——完全不用經過十進制:
| 十六進制 | 二進制 | 十六進制 | 二進制 |
|---|---|---|---|
0 |
0000 |
8 |
1000 |
1 |
0001 |
9 |
1001 |
2 |
0010 |
A |
1010 |
3 |
0011 |
B |
1011 |
4 |
0100 |
C |
1100 |
5 |
0101 |
D |
1101 |
6 |
0110 |
E |
1110 |
7 |
0111 |
F |
1111 |
實際換一個:(11010111)_2 從右往左每 4 位分組是 1101 和 0111,查表分別是 D 和 7,所以
(11010111)_2 = (\mathrm{D7})_{16}
不放心可以驗算:兩邊各自展開位值,都是 215。
這就是工程上愛用十六進制的原因:長度縮成四分之一,卻還能逐位對回二進制。十進制沒有這種好事——10 不是 2 的次方,換算得整個數重算。順帶把上冊 2.2 的知識接上:1 位元組=8 個位元=恰好 2 個十六進制位,所以一個位元組的內容總能寫成兩個十六進制字元。你在生活中其實看過它——網頁的顏色碼 #00A896,就是紅、綠、藍三個位元組各用兩個十六進制位寫出來的。
動手試試看:把 (10111100)_2 分組換成十六進制(每 4 位一組查表),再用 0b10111100 和 0x 你的答案各寫一個字面常數印出來,確認兩個都是 188。