BigInteger Parse Octal String?

На Java я мог бы сделать

//Parsing Octal String
BigInteger b = new BigInteger("16304103460644701340432043410021040424210140423204",8);

Тогда отформатируй как мне угодно

b.toString(2); //2 for binary
b.toString(10); //10 for decimal
b.toString(16); //16 for hexadecimal

C#'s BigInteger предлагает возможности форматирования, показанные выше, но я не могу найти способ для анализа BIIIG (более 64 бит, без знака) восьмеричных значений.

2 ответа

Решение

Это может быть не самым эффективным решением, но если производительность не является приоритетом, вы можете построить BigInteger вручную:

string s = "16304103460644701340432043410021040424210140423204";
BigInteger bi = s.Aggregate(new BigInteger(), (b, c) => b * 8 + c - '0');

Вышеупомянутое решение также работает для любой базы не более 10; просто замени 8 в приведенном выше коде с вашей необходимой базы.

Изменить: для шестнадцатеричных чисел, вы должны использовать Parse метод. Готовить с 0 если ваш номер следует интерпретировать как положительный, даже если его первый символ 8-F,

string s = "0F20051C5E45F4FD68F8E58905A133BCA";
BigInteger bi = BigInteger.Parse(s, NumberStyles.HexNumber);

Простая реализация для hex (и все базы до 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]);
}

Вероятно, арифметика, в которой один операнд является целым, быстрее, чем если бы оба операнда были 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]);
}
Другие вопросы по тегам