web-dev-qa-db-ja.com

intをバイナリに変換する簡単で高速な方法は?

私が探しているのは、C#のPHP decbin関数のようなものです。この関数は、小数を文字列としての表現に変換します。

たとえば、decbin(21)を使用すると、10101結果として。

私は この関数 を見つけましたが、これは基本的に私が望むことをしますが、おそらくより良い/より速い方法がありますか?

61
Max
var result = Convert.ToString(number, 2);

–(そうでなければ役に立たない)Convertクラスの使用はほとんど唯一です。

159
Konrad Rudolph

ほとんどの方法は、見つけた機能よりも優れており、高速です。変換方法の良い例ではありません。

組み込みメソッド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
30
Guffa
int toBase = 2;
string binary = Convert.ToString(21, toBase); // "10101"
9
Rubens Farias

(少なくとも)指定された桁数のバイナリ値をゼロで埋めるには:

string bin = Convert.ToString(1234, 2).PadLeft(16, '0');

Convert.ToStringは、バイナリ文字列への変換を行います。
PadLeftは、ゼロを追加して最大16桁まで埋めます。

3
Hans Kesting

これは私の答えです:

    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を使用するので、より高速な方法だと思います。

0
Thinh Vu