今天要整理一整組進位轉換的函式,像是 DEC2HEX、HEX2DEC、BIN2DEC 這些名字長得很像的傢伙,還有可以轉成任意進位的 BASE 跟 DECIMAL。
坦白說,我在工作上用到進位轉換的機會很少,一年大概一兩次。比較常見的情況是網頁色碼像 #F4A261 這種十六進位的要拆成 RGB 三個數字,或是看到設備代碼、權限位元像 755 這種,想知道它對應的二進位長怎樣,又或是程式除錯時對一下數值。這篇當作工具書,需要的時候回來查就好。
怎麼選
函式名稱很好記:來源2目標。DEC 是十進位、BIN 是二進位、OCT 是八進位、HEX 是十六進位。想從哪個轉到哪個,把兩邊的縮寫接起來就是函式名。
| 從\到 | DEC | BIN | OCT | HEX |
|---|---|---|---|---|
| DEC | DEC2BIN | DEC2OCT | DEC2HEX | |
| BIN | BIN2DEC | BIN2OCT | BIN2HEX | |
| OCT | OCT2DEC | OCT2BIN | OCT2HEX | |
| HEX | HEX2DEC | HEX2BIN | HEX2OCT |
如果要轉成 2 到 36 之間的其他進位,就用 BASE 把十進位轉過去,DECIMAL 再轉回十進位。
有兩件事先記著,後面每個函式都適用:
- 轉成二進位、八進位、十六進位的結果是文字,不是數字。就算結果看起來全是 0 到 9,例如
BIN2OCT("1111")的17,拿去加 20 會得到 37,因為 Sheets 把它當成十進位的 17 來算,但它其實是八進位的 17,也就是十進位的 15。要算數字,先用XXX2DEC或DECIMAL轉回十進位,這兩種的結果才是真正的數字。 - 輸入的二進位、八進位、十六進位最多 10 位,用二補數表示負數。所以
1111111111這個二進位在這裡代表 -1,不是 1023。
二進位
BIN2DEC
把二進位轉成十進位。
語法:
- 二進位數字:只能有 0 跟 1,最多 10 位,建議用雙引號包起來當文字。
舉例:
二進位 1101 轉十進位
=BIN2DEC("1101")先手算:8 + 4 + 0 + 1 = 13,你應該會得到 13!
要注意,10 位的二進位最左邊那一位是正負號。 會得到 -1,因為負數是用二補數存的。
BIN2HEX
把二進位轉成十六進位。
語法:
- 二進位數字:最多 10 位。
- 位數:選填,結果不足這個位數時,前面補 0。負數會忽略這個參數。
二進位 11111 轉十六進位,補到 8 位
=BIN2HEX("11111", 8)結果是 0000001F。如果結果需要的位數比你指定的還多,會出現 #NUM!。
BIN2OCT
把二進位轉成八進位。
語法:
二進位 1111 轉八進位
=BIN2OCT("1111")結果是 17。三位二進位剛好對應一位八進位,1111 拆成 001 跟 111,就是 1 跟 7。
八進位
OCT2BIN
把八進位轉成二進位。
語法:
八進位 17 轉二進位
=OCT2BIN("17")結果是 1111。
OCT2DEC
把八進位轉成十進位。
語法:
我自己唯一想得到的用途,是 Linux 的檔案權限 755:
八進位 755 轉十進位
=OCT2DEC("755")先手算:7 × 64 + 5 × 8 + 5 = 493,函式也會給你 493。
OCT2HEX
把八進位轉成十六進位。
語法:
八進位 377 轉十六進位
=OCT2HEX("377")結果是 FF。
十進位
DEC2BIN
把十進位轉成二進位。
語法:
- 十進位數字:範圍是 -512 到 511,因為結果最多 10 位。
- 位數:選填,不足時前面補 0。
37 轉二進位,補到 8 位
=DEC2BIN(37, 8)結果是 00100101。不指定位數的話, 就是 100101。
負數的話, 會得到 1111111111。
DEC2OCT
把十進位轉成八進位。
語法:
493 轉八進位
=DEC2OCT(493)結果是 755,剛好是上面 OCT2DEC 的反向。
DEC2HEX
把十進位轉成十六進位,這組裡面我最常碰到的一個。
語法:
- 十進位數字:正數最大到 549755813887,負數最小到 -549755813888。
- 位數:選填,結果不足時前面補 0,負數會忽略。
244 轉十六進位,補到 2 位
=DEC2HEX(244, 2)結果是 F4。像 這樣補位數很實用,會得到 0A,色碼每個顏色都需要固定兩位。
十六進位
HEX2DEC
把十六進位轉成十進位,色碼轉 RGB 就靠它。
語法:
- 十六進位數字:0 到 9、A 到 F,大小寫都可以,最多 10 位。出現其他字元會得到
#NUM!。
十六進位 F4 轉十進位
=HEX2DEC("F4")先手算:15 × 16 + 4 = 244,你應該會得到 244!
HEX2BIN
把十六進位轉成二進位。
語法:
十六進位 F 轉二進位,補到 8 位
=HEX2BIN("F", 8)結果是 00001111。
HEX2OCT
把十六進位轉成八進位。
語法:
十六進位 FF 轉八進位
=HEX2OCT("FF")結果是 377。
任意進位:BASE 與 DECIMAL
上面那 12 個只涵蓋 2、8、10、16 這四種。要轉成其他進位,用這一對。
BASE
把十進位數字轉成指定進位的文字。
語法:
- 數值:0 或正整數,小數會被截掉。
- 進位:2 到 36 的整數。
- 最小長度:選填,結果不足時前面補 0。
5 轉二進位,至少 8 位
=BASE(5, 2, 8)結果是 00000101。另外, 會得到 F4,跟 DEC2HEX 一樣。我個人覺得 BASE 比較好用的地方是不用背那 12 個名字,也沒有 10 位的限制,不過官方說明要求數值是 0 或正整數,負數別丟給它。
Excel 也有這 14 個同名函式,用法與 10 位的限制相同;BASE 和 DECIMAL 要 Excel 2013 以上才有。
DECIMAL
把指定進位的文字轉回十進位。
語法:
- 數值:要轉換的文字,要用雙引號包起來。
- 進位:2 到 36 的整數。
36 進位的 zz 轉十進位
=DECIMAL("zz", 36)先手算:35 × 36 + 35 = 1295。36 進位用 0 到 9 加 A 到 Z,所以 z 代表 35。
實例:色碼轉 RGB
最後來做一個實際的題目。A2 放著色碼 #F4A261,我想拆成紅、綠、藍三個 0 到 255 的數字。
色碼 # 後面是三組兩位的十六進位,所以先用 MID 把每組切出來,再用 HEX2DEC 轉成十進位。紅色在第 2 個字元開始:
取出紅色數值
=HEX2DEC(MID(A2, 2, 2))綠色從第 4 個字元、藍色從第 6 個字元開始:
取出綠色數值
=HEX2DEC(MID(A2, 4, 2))取出藍色數值
=HEX2DEC(MID(A2, 6, 2))來看看結果:
| 色碼 | 紅 | 綠 | 藍 |
|---|---|---|---|
#F4A261 | 244 | 162 | 97 |
反過來,要把這三個數字組回色碼,就是 DEC2HEX 補到兩位再用 & 接起來:
RGB 組回色碼
="#" & DEC2HEX(244, 2) & DEC2HEX(162, 2) & DEC2HEX(97, 2)會得到 #F4A261。
需要的時候回來查一下,就這樣!
接下來可以
相關文章
查看所有文章文字清理函式參考:TRIM、CLEAN、SUBSTITUTE、PROPER 與看不見的空格
整理 TRIM、CLEAN、SUBSTITUTE、REPLACE、UPPER、LOWER、PROPER 的語法與限制,包含 TRIM 清不掉全形空格與 CHAR(160)、CLEAN 只清 ASCII 0 到 31、SUBSTITUTE 第 4 參數只換第 N 次,以及用 UNICODE 找出看不見的字元。
多種幣別一起換成台幣:用 MAP 逐列查匯率與換算
用 MAP 同時讀取金額與幣別,把 USD、JPY、TWD 等資料換成台幣估值。TWD 直接用 1,區分空列、缺欄、錯誤幣碼與非數值金額,並說明動態匯率、四捨五入及歷史記帳的界線。
今天午餐吃什麼?用下拉選單與核取方塊做餐廳抽選器
把分類與餐廳整理成兩欄,用 FILTER、UNIQUE、INDEX 與 RANDBETWEEN 做午餐抽選。包含全部分類、動態下拉、重複餐廳、空名單與重抽核取方塊,說明為什麼其他編輯也會改變結果。
留言討論
共 0 則留言
