Я столкнулся с проблемой, когда у меня есть подразумеваемое шестнадцатеричное число без знака в виде строки, предоставленной из пользовательского ввода, которая должна быть преобразована в Biginteger.Каков правильный способ построения Biginteger из подразумеваемой беззнаковой шестнадцатеричной строки в C#?
Благодаря подписанному характеру Biginteger любой вход, в котором установлен бит наивысшего порядка (0x8/1000b), результирующее число считается отрицательным. Однако эту проблему нельзя решить, просто проверив бит знака и умножив на -1 или получив абсолютное значение из-за дополнения, которое не будет уважать базовую нотацию, например, обрабатывая все значения 0xF * как -1.
Как следует несколько примеров ввода/вывода
var style = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier;
BigInteger.TryParse("6", style) == 6 // 0110 bin
BigInteger.TryParse("8", style) == -8 // 1000 bin
BigInteger.TryParse("9", style) == -7 // 1001 bin
BigInteger.TryParse("A", style) == -6 // 1010 bin
...
BigInteger.TryParse("F", style) == -1 // 1111 bin
...
BigInteger.TryParse("FA", style) == -6 // 1111 1010 bin
BigInteger.TryParse("FF", style) == -1 // 1111 1111 bin
...
BigInteger.TryParse("FFFF", style) == -1 // 1111 1111 1111 1111 bin
Что такое правильный способ построения BigInteger из подразумеваемой без знака шестнадцатеричной строки?
В тех случаях, когда входная строка является полностью числовой, однако допускается префикс «0x». Конечно, я могу проверить наличие указанной подстроки, удалить ее и добавить ноль (на самом деле это то, что я делаю в данный момент). Я просто надеюсь на более правильный ответ. – rheone
Обновлен мой ответ. Добавление начального нуля похоже на правильную технику. – SuperOli
Конечно. Отмечено как правильно, и немного разочарован, нет существующего беззнакового большого числа. – rheone