進制轉換

二進制、八進制、十進制、十六進制互相轉換

十六進制格式:

同一個數在不同場合會換一張臉:Linux 權限寫成八進制的 755、記憶體位址與錯誤碼寫成十六進制的 0x8007000E,而一個 bit flag 欄位只有攤成二進制才看得出哪幾位被打開了。這個工具把二、八、十、十六四個進制並排成四個輸入框,在任何一格打字,其他三格立刻跟著換算,不必先選來源再選目標。整段換算由你這台機器上的瀏覽器完成。

使用步驟

  1. 畫面上是四個並排的輸入框:「二進制 (Binary)」「八進制 (Octal)」「十進制 (Decimal)」「十六進制 (Hex)」。任選一格輸入,另外三格會在你按下每一個鍵之後同步更新——這裡沒有「轉換」按鈕,也沒有選來源/目標進制的下拉選單。
  2. 每一格右邊各有一顆複製按鈕,複製的是那一格當下顯示的字串。
  3. 每一格只收自己的合法字元:二進制是 0 與 1、八進制 0–7、十進制 0–9、十六進制 0–9 與 a–f(大小寫皆可),最前面可以加一個減號。打進範圍外的字元,那一格的邊框會轉紅,下方顯示「無效的十六進制字元」這類提示。
  4. 最下方「十六進制格式:」旁邊那顆按鈕在「大寫 (A-F)」與「小寫 (a-f)」之間切換。按鈕上寫的是目前所在的模式,按下去會立刻改寫十六進制欄位裡已有的內容,之後轉出來的字母也照這個設定走;連那一格的提示文字都會跟著在 1A2B 與 1a2b 之間換。
  5. 把任何一格清空,四格會一起清空。輸入只剩一個減號時,其他三格同樣維持空白,等你把數字打完。
  6. 數值超出 JavaScript 安全整數範圍時,四個欄位上方會浮出一條黃色警告帶(它有一個盲區,下方注意事項會說明)。

什麼時候用得上

讀寫 Linux 檔案權限

chmod 755 裡的 755 是八進制,每一位對應 owner、group、other 各自的三個 bit。把 755 貼進八進制欄位,二進制那格會顯示 111101101,三個一組拆開正好是 rwx r-x r-x。反過來要設「擁有者可讀寫、其他人只能讀」,先在二進制打 110100100,八進制那格就直接給你 644。

拆開 bit flag 欄位

資料庫裡存著 permissions = 22,而程式碼那邊定義 READ=1、WRITE=2、DELETE=4、SHARE=16。把 22 打進十進制欄位,二進制顯示 10110,從右邊數過來第 2、3、5 位是 1,也就是 WRITE + DELETE + SHARE。這比在腦子裡做位元運算可靠,也比開一個 REPL 快。

對照 log 與除錯器裡的十六進制

崩潰報告裡的 0x8007000E、暫存器 dump、封包的長度欄位——這些地方一律用十六進制寫。要跟業務層的十進制對上(例如確認長度欄位 1F4 是不是等於預期的 500),貼進十六進制欄位再看十進制那格就好。記得先把 0x 前綴拿掉。

教學與作業驗算

手算十進制轉二進制最容易在最後幾位出錯。把答案打進二進制欄位,看十進制那格是不是你要的數,一秒對完。四格同時顯示也讓位數對應關係一眼看得出來:把十六進制的 F 改成 10,二進制會從 1111 跳成 10000,正好演示「十六進制的一位等於二進制的四位」。

限制與注意事項

  • 只吃整數,而且是在輸入層就擋掉的。十進制欄位的合法字元集裡沒有小數點,所以 3.14 一打進去就標紅,不會先算出個什麼再回報錯誤。其他三格同理,1011.1 這種二進制小數也送不進去。
  • 欄位會邊打邊改寫自己。每一次按鍵都會重算並回寫全部四格,包括你正在打字的那一格。結果是前導零打不進去(打完 007,欄位裡只剩 7),而在大寫模式下打小寫的 ff,第二個字母才剛按下畫面上就已經是 FF 了。這是控制項本身在回寫,不是複製的時候才做轉換。
  • 換算路徑是「字串解析 → 雙精度浮點數 → 轉成目標進制的字串」,所以 2^53 - 1 以上的數字進去就回不來了。在二進制欄位打 55 個 1(也就是 36028797018963967),十進制會顯示 36028797018963970,而二進制自己被改寫成 1 後面接 55 個 0——比你打進去的還多了一位。
  • 那條黃色警告帶有一個盲區,而且剛好落在最需要它的地方。它的判斷方式是把十進制欄位裡的**字串**再解析一次,拿結果跟 2^53 - 1 比。但數值大到 10^21 以上時,十進制欄位顯示的已經是指數寫法(例如 4.722366482869645e+21),解析器讀到第一個小數點就停在 4,比對於是不成立,警告安靜地消失。實測:在十六進制打滿 18 個 F,那一格當場被改寫成 1000000000000000000、十進制變成上面那串指數,畫面上卻一片安靜。看到十進制欄位出現 e+ 就當作紅燈,不要等警告帶。
  • 負數用的是前置減號,不是二補數。想把 32 位元的 FFFFFFFF 解讀成 -1 在這裡辦不到,它會老實給你 4294967295。要取得有號值請自己看最高位:十進制結果若大於 2^31 - 1,減掉 2^32 就是對應的負數。反方向也一樣,在十進制打 -1 得到的十六進制是 -1,不是 FFFFFFFF。
  • 不吃任何前綴。0x1A、0b1010、#FF6600、組合語言的 $1A 或結尾 h 寫法都會標紅,因為 x、b、#、$、h 都不在合法字元集裡。從程式碼或 CSS 複製過來的值請先把前綴刪掉。同樣地,複製出去的結果也不帶前綴,貼回程式碼裡要自己補。
  • 某一格標紅的時候,其他三格不會清空,而是停在最後一次成功換算的數字上。所以畫面可能同時出現一串紅色的錯字和三個看起來很正常的數值,那三個數並不是這串錯字的換算結果。把錯字改對,四格會一起恢復同步。
  • 就這四個進制,沒有自訂基數的欄位,base32、base36、Crockford Base32 這類編碼都不在範圍內。另外 Base64 常被誤認成「64 進制」,它其實是把位元組串重新編碼成可列印字元的方法,處理的是任意二進位資料而不是一個數值。
  • 四個欄位裡的數字沒有離開過這個分頁,換算是你的瀏覽器當場做的,也沒有被寫進任何紀錄。要說明的是,這一頁跟站上其他頁面一樣會載入第三方廣告資源,那條路徑跟你在輸入框裡打的東西沒有交集。

常見問題

為什麼我貼 `0x1A` 進去整格變紅?

十六進制欄位認的字元是 0–9 與 a–f,x 不在裡面。C、Python、CSS、JSON schema 的字面值前綴都得先拿掉,貼 1A 就通過了。同理二進制的 0b 前綴、以及舊組合語言把基數寫在結尾的 1Ah 也都要清乾淨。

十進制欄位為什麼跑出 `4.722366482869645e+21` 這種寫法?

因為數值已經大到瀏覽器改用指數格式來輸出十進制字串了。出現這個畫面代表結果早就失去精度,而且此時安全整數警告不會亮——它的比對方式讀不懂指數字串。這種量級的數字(雪花 ID、64 位元主鍵、把 UUID 當整數看的寫法)請在後端用大整數型別處理,不要在這裡轉。

我打的最後一個數字被改掉了,是誤觸嗎?

不是。在十進制欄位打 9007199254740993,畫面會停在 9007199254740992。那個輸入比安全整數上限大 2,雙精度浮點數在這個量級上已經表示不出奇數,最接近的可表示值就是那個偶數。任何超過 2^53 - 1 的輸入都會被吸附到附近的可表示值,而且是無聲發生的。

為什麼二進制欄位打不進 `1011.1` 這種小數?

合法字元集只有 0、1 與開頭的減號,小數點按下去就標紅。二進制小數牽涉到的是尾數與指數怎麼擺(IEEE 754 那一套),跟整數換算是兩件不同的事,這個工具沒有處理。想看某個十進制小數在記憶體裡的位元佈局,要找專門顯示浮點數編碼的工具。

「大寫 (A-F)」那顆按鈕上寫的是現在的狀態,還是按下去會變成的狀態?

是現在的狀態。按鈕顯示「大寫 (A-F)」表示十六進制欄位此刻就是大寫,按下去會轉成小寫、按鈕文字同時換成「小寫 (a-f)」。這個設定只影響 A–F 六個字母怎麼呈現,0–9 與數值本身完全不受影響——FF 和 ff 是同一個 255。

可以一次看一整份清單的換算結果嗎?

不行,四個欄位都是單行輸入,一次只處理一個數。貼一串換行分隔的數字進去會因為換行字元不合法而整格標紅。要批次處理請在試算表裡用 DEC2HEX、HEX2DEC 這類函式,或在程式裡跑迴圈。