このページの本文へ

前へ 1 2 次へ

Windows Info 第392回

あらためてWindowsにおける2進数、10進数、16進数について

2023年08月13日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

コマンドラインで2進数、16進数を扱う

 Windows PowerShell(Ver.5.1 以下、WPS)とPowerShell(Ver.7.2、以下、PS7)では16進数を扱うことができる。さらに、PS7では2進数も扱える。まずは、16進数を数値として入力するには前に16進数プリフィックス「0x」を付けて16進数を入力すればよい。この表記は、数値(Int32、符号付き)として解釈されるので、数値が必要な引数のどこにでも置くことができる。

 コマンドラインに直接入力してEnterキーを押せば、10進数に変換された数値を表示できる。これで、簡易に16進数/2進数を10進数に変換できる。また、コマンドラインでそのまま四則演算やmathクラスの関数の引数にすることも可能だ。なお、PS7では、さらに2進数プリフィックス「0b」を使うことができる。

あらためてWindowsにおける2進数、10進数、16進数について

Windows PowerShellでは、16進数プリフィックス「0x」を使って16進数を扱える。PowerShell 7では、さらに2進数プリフィックス「0b」で2進数を扱うことも可能

 このほか、WPSやPS7では、数値の後ろに「KB」「MB」「GB」「TB」「PB」などの「乗数サフィックス」を加えることで、2のべき乗による乗数を付けられる。

あらためてWindowsにおける2進数、10進数、16進数について

 「KB」は、1024倍(2の10乗倍)を示す。たとえば、「4KB」は4096bytesを表す。この乗数サフィックスは、2進数、16進数プリフィックスと同時に使うことができる。たとえば1KBのデータが0x23(=35)個あるなら「0x23KB」とすればよい。

 また、WPS、PS7で数値を16進数、2進数で表現したい場合、ConvertクラスのToStringメソッドを使う。具体的には、

[Convert]::ToString(<数値>、<基数>)

とする。基数は、2、8、10、16のみに対応し、それ以外はエラーになる。また、数値が整数以外の場合には、整数に変換されてから基数変換がなされる。たとえば、「[convert]::ToString(1.45,16)」の答えは「1」になる。

 16進数を扱う頻度が高いなら、

function hex($x) { [Convert]::ToString($x,16) }

などとして、関数を定義してしまったほうがいいかもしれない。

 整数値の場合のみ、以下の書き方ができる。

(<整数リテラル>).ToString("X")
$x.ToString("X")

 2つ目の例では、変数$xには整数が入っているときのみ変換でき、それ以外ではエラーになる。これは、数値の書式表示で16進数を表す「X」を使うもの。「X4」などととして4桁の16進数表示とさせることも可能だ。桁数を指定して16進数にしたいときに使うといいだろう。

 WPSやPS7では、外部のコマンドから文字列として受け取った16進数や2進数を数値に変換したい場合もあるだろう。基本としては、前述とおなじ「[Convert]」クラスの変換メソッドを使い、

[Convert]::ToInt32(<文字列>,<基数>)

とすることで、<文字列>を<基数>に基づいて数値に変換する。ただし、<基数>には、2、8、10、16しか指定することができない。

 また、文字列にすでに2進数、16進数プリフィックスがついた状態なら、

[int]"0x00FF"
[byte]"0b01010101"

として、文字列を数値に変換することができる(「0b」はPS7でのみ可能)。なお、このとき16進数を表す「プレフィックス」として「0x」以外に「#」と「&H」を使うことも可能。「#」は、アセンブラや一部のコマンドで使うことがあり、「&H」は、Microsoft系のBASICなどで使うプリフィックスだ。

あらためてWindowsにおける2進数、10進数、16進数について

[Convert]::ToStringメソッドを使うことで数値を2、8、10、16進数に変換できる。また、書式指定文字「X」を使った16進数変換も可能。文字列にプリフィックスが含まれている場合には、型アクセラレーターを使って直接変化することもできる

 先頭の「[int]」や「[byte]」は、PowerShellでは型アクセラレーターと呼ばれるもので、プログラミング言語でいう「キャスト」に相当するもの。PowerShellでは整数に関しては、以下の表のような型アクセラレーターとConvertクラスの変換メソッドを利用できる。

あらためてWindowsにおける2進数、10進数、16進数について

 そのほか、さまざまなデータ形式に対して型アクセラレーターがある。これに関しては、マイクロソフトのページ(「型アクセラレータについて」)に記載がある。

 ただし、日本語ページでは、本来英文表記である型アクセラレーターの一部が日本語になってしまっている。ページ下にある言語を英語に切り替えれば正しく表示される。

2進数では符号拡張に注意

 PS7で2進数プリフィックスを使って2進数を表現する場合、符号拡張に注意する必要がある。符号拡張とは、型を変換するときに最上位ビットを符号ビットとして変換をすることだ。符号を表す最上位ビットが1であるとすると、変換後も最上位ビットが1になるように変換される。

 たとえば、10進数の255を2進数で表現すると「1111 1111」となるが、そのまま2進数プリフィックスを付けて「0b11111111」とすれば、最上位ビットが1であるとして符号付きInt32に変換される。このため結果は、-1になってしまう。これを防ぐには最上位ビットが0であることを指定して「0b011111111」とする。

あらためてWindowsにおける2進数、10進数、16進数について

PS7で2進数を扱う場合、最上位ビットにより符号の有無が決まる。同じビットパターンでも最上位が0か1かで数値が異なる。型アクセラレーターを使った文字列からの変換でも、型に合致せずエラーになることがある

 2進数文字列と型アクセラレーターを組み合わせる場合、2進数文字列は、型に合致したパターンのみ許される。型アクセラレーター「[byte]」(符号なし8bit整数値)を使うとき、符号なし2進数として、0~255の範囲となっている必要がある。このときに255を指定するには「0b011111111」とする。「0b11111111」では-1になるためエラーとなる。

 なお、ConvertクラスのToInt32などの変換メソッドを使って文字列を数値に変換する場合には、こうした問題は起こらない。

 コンピュータを使っていると、2進数や16進数はいつかは扱わねばならなくなる。10進数への簡単な変換や計算は、Windowsでも簡単にできることは理解しておいてもいいだろう。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン