私はしばしばbc
ユーティリティを使用して16進数を10進数に変換するか、その逆に変換します。ただし、構成方法ibase
とobase
構成方法は常に試行錯誤の問題です。たとえば、ここでは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番目の例では)、変換したい真数にする必要がありますか?C0
ibase
16
ベストアンサー1
あなたが本当にやりたい言葉は次のとおりです。
$ echo "ibase=16; C0" | bc
192
16進数から10進数の場合は、次のようになります。
$ echo "obase=16; 192" | bc
C0
10進数から16進数への場合。
ibase
10進数に関連する変換の場合、この設定のデフォルト値は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つの例がこのように機能する理由を見てみましょう。
echo "ibase=F;obase=A;C0" | bc
180
これは、1桁の値が16進数として解釈されるため、入力基数を15に、出力基数を10に設定するため、POSIXによると。これは、
bc
基本A₁₅=10のC0₁₅が何であるかを知らせるように求め、180₁₀と正確に答えます。しかし、これは確かにあなたが尋ねたかった質問ではありません。echo "ibase=F;obase=10;C0" | bc
C0
これはデフォルトの15ヌル変換です。
なぜ?まず、
F
前の例で指摘したように、単一の数字は16進数として解釈されるためです。ただし、これはデフォルト15に設定されているため、次の出力デフォルト設定は10₁₅=15と解釈されるため、C0₁₅からC0₁₅へのnull変換が発生します。そうですね。出力は仮定した通り、16進数ではなく15進法です!
F0
代わりに、切り替えを試して自分で証明できますC0
。F
15進数には数字がないため、固定されてbc
出力E0
として提供されます。E0
echo "ibase=16; obase=A; C0"
192
これは実際に使用できる3つの例のうちの唯一のものです。
入力基準を16進数に変更します。最初
A
したがって、POSIX仕様が16進数(この場合は10)と解釈される理由を理解するために、POSIX仕様を調べる必要はありません。唯一の問題は、出力基準をA₁₆=10に設定することがデフォルトであるため、重複することです。