在使用 bc 進行轉換時了解“ibase”和“obase”嗎?
我經常使用
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
這裡的邏輯是什麼?
obase
(A
在我的第三個範例中)需要與轉換的值(C0
在我的範例中)在同一個基數中,並且ibase
(16
在我的第三個範例中)必須在我要轉換到的基數中?
你真正想說的是:
$ echo "ibase=16; C0" | bc 192
對於十六進製到十進制,並且:
$ echo "obase=16; 192" | bc C0
對於十進製到十六進制。
對於任何涉及十進制數的轉換,您不需要同時給出
ibase
和obase
,因為這些設置預設為 10。您確實需要同時提供二進製到十六進制等轉換。在這種情況下,我發現如果你
obase
先給出,最容易理解事物:$ echo "obase=16; ibase=2; 11000000" | bc C0
如果您
ibase
先給出,它會更改以下obase
設置的解釋,因此命令必須是:$ echo "ibase=2; obase=10000; 11000000" | bc C0
這是因為在此順序中,該
obase
值被解釋為二進制數,因此您需要給出 10000₂=16 才能獲得十六進制輸出。這很笨拙。現在讓我們弄清楚為什麼您的三個範例的行為如此。
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 是多餘的,因為這是它的預設值。