【小記】二八十十六,進位團團轉
這篇筆記咱主要寫一下二進位、八進位、十進位、十六進位之間的互相轉換。
Contents
前言
通過觀察,我覺得二、八、十、十六進位數的互相轉換可以總結為三大塊:
- 十進位與其他進位互相轉換
- 二進位與其他進位互相轉換
- 十六進位與八進位的互相轉換
話不多說,下面就按這三大塊來歸納一下。
十進位與其他進位的互相轉換
十進位到其他進位
整數部分
💡 方法:除以基數倒取余
比如16進位,除以的基數就是16
-
「除以基數」指的是將十進位數不斷除以目標進位對應的基數,直到商為
0為止。 -
「倒取余」指的是將每次相除得到的餘數倒序排列,即轉換為了目標進位的數。
-
[例] 10進位轉換為8進位

圖中的紅色箭頭展示了「倒取余」的過程
圖中將十進位數
1145轉換為了八進位數2171 -
[例] 10進位轉換為16進位

圖中的紅色箭頭展示了「倒取余」的過程
圖中將十進位數
14191轉換為了十六進位數376F
小數部分
⚠ 不是所有的小數都能轉換為其他進位。比如現代電腦採用二進位計數,有很多小數都沒法準確地轉換為二進位(只能取近似值),這也是為什麼說現在電腦無法完全準確地表示小數。
💡 方法:乘以基數順取整
比如2進位,對應的基數就是2
-
「乘以基數」指的是不斷將小數部分乘以目標進位對應的基數,直到小數部分為
0為止。 -
「順取整」指的是將每次相乘得到的數的整數部分順序排列,即轉換為了目標進位的數。
-
[例] 2進位轉換為10進位

圖中的紅色箭頭展示了「順取整」的過程
圖中將十進位數
0.375轉換為了二進位數0.011
其他進位到十進位
💡 方法:每一位數字乘上基數^對應指數(位權),然後相加求和

本圖中的數值
12C.1415926,是十六進位數。
上圖中,基數是16,「對應指數」就是橙色標出的數。以小數點為分界,小數點左側第一位的對應指數為0,而小數點右側第一位的對應指數為-1。
從低位向高位(圖中從右向左),這個指數不斷增大。
十六進位的基數是16,那麼八進位的基數就是8,以此類推。
-
[例] 16進位轉換為10進位

圖中將十六進位數
12C.14轉換為了十進位數300.078125
二進位與其他進位的互相轉換
二進位和其他進位的互相轉換就要方便多了。
二進位到其他進位
💡 方法:以小數點為界,向左右兩側,每幾位讀為一個數,不足的就補零。
-
關於這裡的「每幾位」,需要看要轉換為哪個進位的數。比如轉換為十六進位,其一位能表示
0-F這16種狀態,需要用4個二進位位來表示,那麼就是每4位一讀。再比如八進位一位能表示
0-7這8種狀態,需要用3個二進位位來表示,那麼就是每3位一讀。 -
關於補零,無論是從小數點左側第一位開始往左每幾位一讀,還是從小數點右側第一位開始往右每幾位一讀,都難免遇到「位數不夠讀」的情況,這個時候就需要補零。
-
[例] 二進位轉換為十六進位

圖中將二進位數
1001001.011轉換為了十六進位數49.6- 紅色箭頭展示了以小數點為分界,分別往左右進行讀取。左側從低位向高位,而右側從高位向低位。
- 圖中括弧展示了補零的過程。
100和011都不足4位,按照讀取方向,分別在其左方和右方補零。 - 最後,每4位一讀,用十六進位表示出來,就得到了最後的結果。
-
[例] 二進位轉換為八進位

圖中將二進位數
1001101.1011轉換為了八進位數115.54- 具體做法和上面一個例子一致,這裡不多贅述。
其他進位到二進位
💡 方法:每位讀為幾位二進位數。
-
關於這裡的「每位讀為幾位二進位數」,需要看轉換前是哪個進位的數。比如原本是十六進位,其一位能表示
0-15這16種狀態,需要用4個二進位位來表示,那麼就是每位讀為4位二進位數。 -
附一個對照表:
八進位位 ←對應的二進位 十六進位位 ←對應的二進位 000000000100110001201020010301130011410040100510150101611060110711170111– – 81000– – 91001– – A1010– – B1011– – C1100– – D1101– – E1110– – F1111實際應用中,可以根據8421碼來進行計算,不用死記硬背。
比如三位二進位
101, 對應421,轉換為十進位就是4+1=5。
再比如四位二進位1010, 對應8421,轉換為十進位就是8+2=10。
-
[例] 八進位轉換為二進位

圖中將八進位數
67.23轉換為了二進位數110111.010011- 每一位八進位位讀成3位二進位數(一位八進位位能表達8種狀態,需要3位二進位位來表示)
不想用8421碼其實也沒問題,八進位和十六進位的每一位數其實可以看作是十進位整數,使用除2倒取余的方法能將其逐位展開為二進位數。
(本質上還是按位讀取,每位讀為幾位二進位數)
比如上圖中,原八進位數中的
6與3分別可以用除2倒取余的方法展開為110與011,和8421碼得出的結果一致。
十六進位與八進位的互相轉換
十六進位和八進位之間無法直接轉換:
- 如果要把十六進位數轉換為八進位數,就需要先將十六進位轉換為十進位或二進位,進而再轉換為八進位。
- 把八進位轉為十六進位也需要用十進位或二進位「過渡一下」
八進位轉十六進位的例子
-
通過二進位進行間接轉換

上圖中我將八進位數
12.450先轉換為了二進位數001010.100101000,再轉換為了十六進位數A.94。二進位和其他進位互相轉換的方法在上面已經介紹過了,這裡就不多贅述。
-
通過十進位進行間接轉換

上圖中我將八進位數
12.450先轉換為了十進位數10.578125,再轉換為了十六進位數A.94。- 這裡再提一嘴:十進位轉為其他進位時,需將整數和小數分而治之。
十進位和其他進位互相轉換的方法在上面也已經介紹過了,這裡就不多贅述。
十六進位轉八進位的例子
-
通過二進位進行間接轉換

上圖中我將十六進位數
C.98先轉換為了二進位數1100.10011000, 再轉換為了八進位數14.46。可以看到,十六進位轉八進位和八進位轉十六進位的過程是十分類似的。
-
通過十進位進行間接轉換

上圖中我將十六進位數
C.98先轉換為了十進位數12.59375, 再轉換為了八進位數14.46。
冷笑話

這位老夥計為什麼要在萬聖節前夜穿上聖誕節的服裝呢?
答:因為 Oct 31 = Dec 25。
October(十月) 31 是萬聖節前夜,December(十二月) 25 是聖誕節。
但是在這也可以理解成Octal(八進位)31= Decimal(十進位)25(*^_^*)














