2進数、10進数、16進数 リテラル表記、相互変換

数値

2進数、10進数、16進数のリテラル、相互変換について説明します。

リテラル表記

リテラル表記とは特定のデータ型を直接表記する書式のことです。
例えば16進法を記載する際10~15はA~Fで記載するため文字列としなければいけませんが、リテラル表記を用いることで数値として扱うことができます。

では以下に2進法と16進法のリテラル表記について記載します。

2進法のリテラル表記

2進法のリテラル表記は、先頭に「0b」を付けます。

int bit = 0b00011010;   //0b11010 でも大丈夫 これは10進法で26と同値です。

16進法のリテラル表記

16進法のリテラル表記は、先頭に「0x」を付けます。

int hex = 0x1A;   //これは10進法で26と同値です。

2進法、10進法、16進法の相互変換

データベースに保存したり、ファイルにデータを登録する際、10進数で登録されていればよいですが場合によって2進数であったり、16進数であったりします。その場合10進数に戻す必要が出てきます。

2進数文字列を10進数の数値に変換

2進数の文字列から10進数の数値に変換をする場合、System.Convert.ToInt32(2進数文字列, 2)を使用します。

string bit = "00011010";    //2進数文字列

//2進数文字列を10進数に変換
int dec = System.Convert.ToInt32(bit, 2);

Console.WriteLine($"2進数から10進数の変換:{ bit } => { dec }" );

16進数文字列を10進数の数値に変換

16進数の文字列から10進数の数値に変換をする場合、System.Convert.ToInt32(16進数文字列, 16)を使用します。

string hex = "1A";    //16進数文字列

//16進数文字列を10進数に変換
int dec = System.Convert.ToInt32(hex, 16);

Console.WriteLine($"16進数から10進数の変換:{ hex } => { dec }");

10進数を2進数文字列に変換

10進数の数値から16進数の文字列に変換をする場合、System.Convert.ToString(数値, 2)を使用します。

int dec = 26;    //数値

//10進数から2進数文字列に変換
string bit = System.Convert.ToString(dec, 2);

Console.WriteLine($"10進数から2進数の変換:{ dec } => { bit }");

//0埋めしたい場合は、以下のようにすればよい
bit = bit.PadLeft(8, '0');    //2進数文字列を8桁にする

Console.WriteLine($"10進数から2進数の変換(0埋め):{ dec } => { bit }");

10進数を16進数文字列に変換

10進数の数値から16進数の文字列に変換をする場合、System.Convert.ToString(数値, 2)または数値.ToString(“x”)を使用します。

int dec = 26;    //数値

//10進数から16進数文字列に変換
string hex = System.Convert.ToString(dec, 16);
//以下でもよい
//string hex = dec.ToString("x");   //英字が小文字になる
//string hex = dec.ToString("X");   //英字が大文字になる

Console.WriteLine($"10進数から16進数の変換:{ dec } => { hex }");

//0埋めしたい場合は、以下のようにすればよい
hex = hex.PadLeft(4, '0');  //4桁16進数

//大文字にしたい場合は、以下のようにすればよい
hex = hex.ToUpper();  //ToString("X")の場合は必要ない

Console.WriteLine($"10進数から16進数の変換(大文字0埋め):{ dec } => { hex }");

2進数文字列から16進数文字列に変換する

直接変換する関数がないので、2進数文字列を一度10進数の数値にしてそれを16進数に変換します。

string bit = "00011010";    //2進数文字列

//2進数から16進数文字列に変換
string hex = System.Convert.ToString(System.Convert.ToInt32(bit, 2), 16);
//以下でもよい
//string hex = System.Convert.ToInt32(bit, 2).ToString("x");   //英字が小文字になる
//string hex = System.Convert.ToInt32(bit, 2).ToString("X");   //英字が大文字になる

Console.WriteLine($"2進数から16進数の変換:{ bit } => { hex }");

16進数文字列から2進数文字列に変換する

こちらも先ほど同様、16進数文字列を一度10進数の数値にしてそれを2進数に変換します。

string hex = "1A";    //16進数文字列

//2進数から16進数文字列に変換
string bit = System.Convert.ToString(System.Convert.ToInt32(hex, 16), 2);

Console.WriteLine($"16進数から2進数の変換:{ hex } => { bit }");

2進数、16進数は文字列であることに注意してください。

引数に利用する2進数と16進数は文字列です。どんな文字列でも入れられるので変換に失敗するとExceptionが発生します。

なので以下のように関数化しておいてどんな文字列が来ても対応できるようにしておくのがよいと思います。

public bool TryBit2Dec(string bit, out int dec)
{
    try
    {
        dec = Convert.ToInt32(bit, 2);

        return true;
    }
    catch
    {
        dec = 0;
        return false;
    }
}

仮にエラーになるような文字列だとしても、例外には飛ばないようにします。

string bit = "gfg";

int dec;

if (TryBit2Dec(bit, out dec) == false)
{
    MessageBox.Show("変換に失敗しました。");
    return;
}
MessageBox.Show(dec.ToString());

まとめ

2進数や16進数は、あまりなじみのない人も多いかと思います。

私の場合、装置の異常検知のデータが2進数文字列で送られてくるのでand演算でフィルタリングする際に10進数に変換たり、装置の画面表示でOn、Off表示(つまりビット表示)だったのですが、装置内のデータが16進数文字列でもっていたのでそれを2進数文字列に変換してOnになっているビットを確認したりという場面で利用しました。

タイトルとURLをコピーしました