セージ の メモ書き

メモこそ命の恩人だ

C# - "10進数→2進数" の変換

Convert.ToString メソッド

docs.microsoft.com

  • 指定した値を*進数に変換できる。(*:2/8/10/16)
  • 整数のみ変換できる。小数は変換できない。
int value = 26;
Debug.WriteLine(Convert.ToString(value, toBase: 2));
// 11010

8桁でゼロパディングする場合、PadLeft を使用する。

Debug.WriteLine(Convert.ToString(value, toBase: 2).PadLeft(8, '0'));
// 00011010


変換の考え方

整数の場合

  • "2" で割っていくことで、下位桁から順に2進数の値を抽出できる。
  • "10進数を2で割る" 方法は、2進数の下位桁を抽出することである。

自作するなら、こんな感じ。

string ConvertNumber(int decimalNumber, int toBase) 
{
    var numberList = new List<int>();
    var nowValue = decimalNumber;
    while (nowValue > 0)
    {
        numberList.Add(nowValue % toBase);
        nowValue /= toBase;
    }
    numberList.Reverse();
    return string.Join("", numberList);
}
Debug.WriteLine($"標準 : {Convert.ToString(26, toBase: 2)}, 自作: {ConvertNumber(26, toBase: 2)}");
//標準: 11010, 自作: 11010

Debug.WriteLine($"標準 : {Convert.ToString(50, toBase: 2)}, 自作: {ConvertNumber(50, toBase: 2)}");
//標準: 110010, 自作: 110010

Debug.WriteLine($"標準 : {Convert.ToString(100, toBase: 2)}, 自作: {ConvertNumber(100, toBase: 2)}");
//標準: 1100100, 自作: 1100100

// Convert.ToString と同じ結果になったことを確認。

3進数~9進数でも変換できる。11進数以上は未対応。英字の概念が必要なので。

Debug.WriteLine($"3進数: {ConvertNumber(26, toBase: 3)}");
//3進数: 222
Debug.WriteLine($"4進数: {ConvertNumber(26, toBase: 4)}");
//4進数: 122
Debug.WriteLine($"5進数: {ConvertNumber(26, toBase: 5)}");
//5進数: 101
Debug.WriteLine($"6進数: {ConvertNumber(26, toBase: 6)}");
//6進数: 42
Debug.WriteLine($"7進数: {ConvertNumber(26, toBase: 7)}");
//7進数: 35
Debug.WriteLine($"8進数: {ConvertNumber(26, toBase: 8)}");
//8進数: 32
Debug.WriteLine($"9進数: {ConvertNumber(26, toBase: 9)}");
//9進数: 28
Debug.WriteLine($"10進数: {ConvertNumber(26, toBase: 10)}");
//10進数: 26 (★元データと一致)


小数の場合

  • "2" を掛けていくことで、上位桁から順に2進数の値を抽出できる。
  • "10進数の小数に2を掛ける" 方法は、2進数の上位桁を抽出することである。
  • 整数部の 1 は 0 にして考える。整数部は使わないので。

自作するなら、こんな感じ。

string ConvertNumber(double decimalNumber, int toBase) 
{
    var numberList = new List<int>();
    var nowValue = decimalNumber;
    while (nowValue != 0)
    {
        // 循環小数の対策
        const int maxLength = 20;
        if (numberList.Count > maxLength) break;

        nowValue *= toBase;
        var integer = (int)nowValue;
        numberList.Add(integer);
        if (nowValue >= 1) nowValue -= integer;
    }
    return $"0.{string.Join("", numberList)}";
}
Debug.WriteLine($"2進数: {ConvertNumber(0.625, toBase: 2)}");
//2進数: 0.101
Debug.WriteLine($"3進数: {ConvertNumber(0.625, toBase: 3)}");
//3進数: 0.121212121212121212121
Debug.WriteLine($"4進数: {ConvertNumber(0.625, toBase: 4)}");
//4進数: 0.22
Debug.WriteLine($"5進数: {ConvertNumber(0.625, toBase: 5)}");
//5進数: 0.303030303030303030303
Debug.WriteLine($"6進数: {ConvertNumber(0.625, toBase: 6)}");
//6進数: 0.343
Debug.WriteLine($"7進数: {ConvertNumber(0.625, toBase: 7)}");
//7進数: 0.424242424242424242424
Debug.WriteLine($"8進数: {ConvertNumber(0.625, toBase: 8)}");
//8進数: 0.5
Debug.WriteLine($"9進数: {ConvertNumber(0.625, toBase: 9)}");
//9進数: 0.555555555555555555555
Debug.WriteLine($"10進数: {ConvertNumber(0.625, toBase: 10)}");
//10進数: 0.625 (★元データと一致)



以上