Bc

在使用 bc 進行轉換時了解“ibase”和“obase”嗎?

  • January 29, 2022

我經常使用bc實用程序將十六進制轉換為十進制,反之亦然。ibase但是,如何以及obase應該如何配置總是有點反複試驗。例如這裡我想將十六進制值 C0 轉換為十進制:

$ echo "ibase=F;obase=A;C0" | bc
180
$ echo "ibase=F;obase=10;C0" | bc
C0
$ echo "ibase=16;obase=A;C0" | bc
192

這裡的邏輯是什麼?obaseA在我的第三個範例中)需要與轉換的值(C0在我的範例中)在同一個基數中,並且ibase16在我的第三個範例中)必須在我要轉換到的基數中?

你真正想說的是:

$ echo "ibase=16; C0" | bc
192

對於十六進製到十進制,並且:

$ echo "obase=16; 192" | bc
C0

對於十進製到十六進制。

對於任何涉及十進制數的轉換,您不需要同時給出ibaseobase,因為這些設置預設為 10。

確實需要同時提供二進製到十六進制等轉換。在這種情況下,我發現如果你obase先給出,最容易理解事物:

$ echo "obase=16; ibase=2; 11000000" | bc
C0

如果您ibase先給出,它會更改以下obase設置的解釋,因此命令必須是:

$ echo "ibase=2; obase=10000; 11000000" | bc
C0

這是因為在此順序中,該obase值被解釋為二進制數,因此您需要給出 10000₂=16 才能獲得十六進制輸出。這很笨拙。


現在讓我們弄清楚為什麼您的三個範例的行為如此。

  1. echo "ibase=F;obase=A;C0" | bc

180

根據 POSIX,這將輸入基數設置為 15,將輸出基數設置為 10,因為單個數字值以十六進制解釋。這要求bc告訴您底數 A₁₅=10 中的 C0₁₅ 是多少,並且它正確回答了 180₁₀,儘管這肯定不是您要問的問題。 2. echo "ibase=F;obase=10;C0" | bc

C0

這是以 15 為基數的空轉換。

為什麼?F首先,正如我在前面的範例中指出的那樣,因為單個數字是用十六進制解釋的。但是現在您已將其設置為基數 15,以下輸出基數設置會以這種方式解釋,並且 10₁₅=15,因此您可以進行從 C0₁₅ 到 C0₁₅ 的空轉換。

沒錯,輸出不像你假設的那樣是十六進制的,它是以 15 為底的!

您可以通過嘗試轉換F0而不是C0. F由於基數 15中沒有數字,bc因此將其箝位到E0,並E0作為輸出給出。 3. echo "ibase=16; obase=A; C0"

192

這是您的三個範例中唯一一個可能有實際用途的範例。

它將輸入基數更改為 hex first,因此您不再需要深入研究 POSIX 規範來了解為什麼A被解釋為 hex,在這種情況下為 10。唯一的問題是將輸出基數設置為 A₁₆=10 是多餘的,因為這是它的預設值。

引用自:https://unix.stackexchange.com/questions/199615