私が探しているのは、C#のPHP decbin
関数のようなものです。この関数は、小数を文字列としての表現に変換します。
たとえば、decbin(21)
を使用すると、10101
結果として。
私は この関数 を見つけましたが、これは基本的に私が望むことをしますが、おそらくより良い/より速い方法がありますか?
var result = Convert.ToString(number, 2);
–(そうでなければ役に立たない)Convert
クラスの使用はほとんど唯一です。
ほとんどの方法は、見つけた機能よりも優れており、高速です。変換方法の良い例ではありません。
組み込みメソッドConvert.ToString(num, base)
は当然の選択ですが、異なる動作をする必要がある場合は、簡単に置換を書くことができます。
これは、2進数の長さを指定できる簡単な方法です。
public static string ToBin(int value, int len) {
return (len > 1 ? ToBin(value >> 1, len - 1) : null) + "01"[value & 1];
}
再帰を使用し、最初の部分(+の前)がそれ自体を呼び出して、最後の桁を除く数値のバイナリ表現を作成し、2番目の部分が最後の桁を処理します。
例:
Console.WriteLine(ToBin(42, 8));
出力:
00101010
int toBase = 2;
string binary = Convert.ToString(21, toBase); // "10101"
(少なくとも)指定された桁数のバイナリ値をゼロで埋めるには:
string bin = Convert.ToString(1234, 2).PadLeft(16, '0');
Convert.ToStringは、バイナリ文字列への変換を行います。
PadLeftは、ゼロを追加して最大16桁まで埋めます。
これは私の答えです:
static bool[] Dec2Bin(int value)
{
if (value == 0) return new[] { false };
var n = (int)(Math.Log(value) / Math.Log(2));
var a = new bool[n + 1];
for (var i = n; i >= 0; i--)
{
n = (int)Math.Pow(2, i);
if (n > value) continue;
a[i] = true;
value -= n;
}
Array.Reverse(a);
return a;
}
モジュロと除算の代わりにPowを使用するので、より高速な方法だと思います。