[解決済み] .NETで10進数を任意の進数に変換する最速の方法とは?
質問
私が書いた古い(と思われる)C#メソッドがあり、それは数値を受け取り、任意のベースに変換します。
string ConvertToBase(int number, char[] baseChars);
超スピードですっきりとはいきませんね。.NETでこれを実現する良い既知の方法はないのでしょうか?
私は何かを探しているのですが、それは私が を使用できるものを探しています。 ベースに任意の文字列を指定して使用できるものを探しています。
これは、ベース16、10、8、2のみを許可します。
Convert.ToString(1, x);
これを利用して、数字、すべて小文字、すべて大文字を駆使して、大量にベースを実現したい。例えば このスレッド のように、しかしJavaScriptではなくC#のために。
誰かC#でこれを行うための良い、効率的な方法を知っていますか?
どのように解決するのですか?
Convert.ToString
は、数値を指定された基数の等価な文字列表現に変換するために使用することができます。
の例です。
string binary = Convert.ToString(5, 2); // convert 5 to its binary representation
Console.WriteLine(binary); // prints 101
しかし、コメントで指摘されているように
Convert.ToString
は以下の限られた-しかし典型的には十分な-塩基のセットをサポートするだけです: 2, 8, 10, または 16。
更新 (任意のベースに変換する要件を満たすため)。
私はBCLに数値を任意のベースに変換できるメソッドを知らないので、あなた自身の小さなユーティリティ関数を書く必要があります。簡単なサンプルは次のようなものです(文字列の連結を置き換えることで、確実に高速化できることに注意してください)。
class Program
{
static void Main(string[] args)
{
// convert to binary
string binary = IntToString(42, new char[] { '0', '1' });
// convert to hexadecimal
string hex = IntToString(42,
new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'});
// convert to hexavigesimal (base 26, A-Z)
string hexavigesimal = IntToString(42,
Enumerable.Range('A', 26).Select(x => (char)x).ToArray());
// convert to sexagesimal
string xx = IntToString(42,
new char[] { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'});
}
public static string IntToString(int value, char[] baseChars)
{
string result = string.Empty;
int targetBase = baseChars.Length;
do
{
result = baseChars[value % targetBase] + result;
value = value / targetBase;
}
while (value > 0);
return result;
}
/// <summary>
/// An optimized method using an array as buffer instead of
/// string concatenation. This is faster for return values having
/// a length > 1.
/// </summary>
public static string IntToStringFast(int value, char[] baseChars)
{
// 32 is the worst cast buffer size for base 2 and int.MaxValue
int i = 32;
char[] buffer = new char[i];
int targetBase= baseChars.Length;
do
{
buffer[--i] = baseChars[value % targetBase];
value = value / targetBase;
}
while (value > 0);
char[] result = new char[32 - i];
Array.Copy(buffer, i, result, 0, 32 - i);
return new string(result);
}
}
アップデート2(性能改善)
文字列の連結の代わりに配列バッファを使用して結果の文字列を作成することで、特に大きな数でパフォーマンスが向上します (
IntToStringFast
). 最良の場合(すなわち、可能な限り長い入力)、この方法はおよそ3倍速くなります。しかし、1桁の数字(つまり、ターゲットの基数の1桁)に対しては
IntToString
の方が速くなります。
関連
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] .NETで文字列を改行で分割する最も簡単な方法とは?
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] .NET String.Format()で数値の千の位にカンマを追加する
-
[解決済み] 文字列の最初の文字を大文字にする(最大限のパフォーマンスを発揮する)
-
[解決済み] .NET / C# - char[]を文字列に変換する
-
[解決済み】汎用辞書の大文字・小文字を区別しないアクセス方法
-
[解決済み】任意の基数の整数を文字列に変換する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】C#で四捨五入する方法
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】Nullableオブジェクトは値を持たなければならない?