bcを使って変換するときに「ibase」と「obase」を理解していますか?

bcを使って変換するときに「ibase」と「obase」を理解していますか?

私はしばしばbcユーティリティを使用して16進数を10進数に変換するか、その逆に変換します。ただし、構成方法ibaseobase構成方法は常に試行錯誤の問題です。たとえば、ここでは16進値C0を10進数に変換したいと思います。

$ 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(3番目の例では)A変換される値(3番目の例では)と同じ進数でなければならず(3番目の例では)、変換したい真数にする必要がありますか?C0ibase16

ベストアンサー1

あなたが本当にやりたい言葉は次のとおりです。

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

16進数から10進数の場合は、次のようになります。

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

10進数から16進数への場合。

ibase10進数に関連する変換の場合、この設定のデフォルト値は10です。obase

あなたする2進数から16進数に変換するには、両方を指定する必要があります。この場合、最初に以下を提供すると、状況を理解するのが最も簡単であることがわかりましたobase

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

最初に提供すると、ibase次の設定の解釈が変更されるため、obaseコマンドは次のようになります。

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

この順序では、obase値は2進数として解釈されるため、16進数の出力を取得するには100002 = 16を指定する必要があるためです。これはとても不器用です。


次に、3つの例がこのように機能する理由を見てみましょう。

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

    180

    これは、1桁の値が16進数として解釈されるため、入力基数を15に、出力基数を10に設定するため、POSIXによると。これは、bc基本A₁₅=10のC0₁₅が何であるかを知らせるように求め、180₁₀と正確に答えます。しかし、これは確かにあなたが尋ねたかった質問ではありません。

  2. echo "ibase=F;obase=10;C0" | bc

    C0

    これはデフォルトの15ヌル変換です。

    なぜ?まず、F前の例で指摘したように、単一の数字は16進数として解釈されるためです。ただし、これはデフォルト15に設定されているため、次の出力デフォルト設定は10₁₅=15と解釈されるため、C0₁₅からC0₁₅へのnull変換が発生します。

    そうですね。出力は仮定した通り、16進数ではなく15進法です!

    F0代わりに、切り替えを試して自分で証明できますC0F15進数には数字がないため、固定されてbc出力E0として提供されます。E0

  3. echo "ibase=16; obase=A; C0"

    192

    これは実際に使用できる3つの例のうちの唯一のものです。

    入力基準を16進数に変更します。最初Aしたがって、POSIX仕様が16進数(この場合は10)と解釈される理由を理解するために、POSIX仕様を調べる必要はありません。唯一の問題は、出力基準をA₁₆=10に設定することがデフォルトであるため、重複することです。

おすすめ記事