16 進数 (および 16 までのすべての基数) の単純な実装。文字列定数に文字を追加して展開します(クレジットが必要な場合はクレジット。これはダグラスの回答に基づいています):
private const string digits = "0123456789ABCDEF";
private readonly Dictionary<char, BigInteger> values
= digits.ToDictionary(c => c, c => (BigInteger)digits.IndexOf(c));
public BigInteger ParseBigInteger(string value, BigInteger baseOfValue)
{
return value.Aggregate(
new BigInteger,
(current, digit) => current * baseOfValue + values[digit]);
}
1 つのオペランドが int である演算は、両方のオペランドが BigInteger である場合よりも高速である可能性があります。その場合:
private readonly Dictionary<char, int> values
= digits.ToDictionary(c => c, c => digits.IndexOf(c));
public BigInteger ParseBigInteger(string value, int baseOfValue)
{
return value.Aggregate(
new BigInteger,
(current, digit) => current * baseOfValue + values[digit]);
}