C # Biginteger для огромного количества бит

Я хотел бы знать, есть ли эффективный способ хранения большого числа с помощью C #. Я хочу создать число, состоящее из 960 байт, но BigInteger не может его вместить. Буду признателен за любой совет.

ОБНОВЛЕНИЕ: я использую генератор случайных байтов для заполнения массива, необходимого для конструктора BigInteger. Для 960-байтового массива i BigInteger возвращает отрицательное число.


person Dago    schedule 23.11.2015    source источник
comment
почему не может BigInteger удержать его? Он должен быть в состоянии хранить столько данных, сколько у вас есть доступной памяти ...   -  person user1666620    schedule 23.11.2015
comment
Какая у вас ошибка ? Как вы это заявляете? Вы можете показать образец.   -  person Marshal    schedule 23.11.2015
comment
Это поможет вам: stackoverflow.com/questions/18444337/   -  person FiN    schedule 23.11.2015
comment
Это большое число. Вы каталогизируете песчинки?   -  person James Thorpe    schedule 23.11.2015
comment
Этот вопрос требует более подробной информации. Это также должно быть более направленным. Какие проблемы вы испытываете? Покажи свой код.   -  person tdbeckett    schedule 23.11.2015
comment
редактирую вопрос.   -  person Dago    schedule 23.11.2015
comment
Возможно, вам стоит опубликовать код, на который вы ссылаетесь.   -  person Matt    schedule 23.11.2015
comment
если число отрицательное, это не потому, что оно слишком велико для BigInteger, а потому, что ваше число на самом деле отрицательное значение.   -  person user1666620    schedule 23.11.2015
comment
@JamesThorpe: больше похоже на атомы в известной вселенной. 960 байт - это примерно 2311 десятичных цифр. Число атомов в известной вселенной оценивается от 10 ^ 80 до 10 ^ 85. <грамм>   -  person Rudy Velthuis    schedule 24.11.2015


Ответы (1)


static void Main(string[] args)
{
    var arr = new byte[960];

    for (int i = 0; i != arr.Length; i++)
    {
        arr[i] = byte.MaxValue;
    }

    var big = new BigInteger(arr);
}

работает нормально, и результат -1, потому что число представлено в дополнении до двух. Это означает, что число с просто 1s в двоичном формате всегда разрешается в -1, как вы можете видеть в статье.


если вы добавите еще одну длину и установите для последнего элемента массива ноль, вы должны получить положительное число, которое представляет ваше двоичное число (этот один байт вам не повредит):

var arr = new byte[961];
arr[arr.Length-1] = 0;
var big2 = new BigInteger(arr);

но тогда вы действительно должны быть уверены, в каком формате ваше двоичное число и что BigInteger "читает"

person Jens    schedule 23.11.2015
comment
спасибо, действительно работает нормально. Я просто подумал, что у меня переполнение. - person Dago; 23.11.2015
comment
в первые пять секунд я тоже был удивлен, но потом понял, что это дополнение. я также добавлю раствор - person Jens; 23.11.2015
comment
подводить итоги. Если мой BigInteger имеет отрицательный знак, это означает, что мои 960 байт представляют отрицательное число, верно? - person Dago; 23.11.2015
comment
@ Даго да. Когда MSB (самый старший бит) равен 1, ваше число отрицательное. Это означает выполнение (это устанавливает MSB в 1): arr[arr.Length - 1] |= 0b1000 0000 всегда будет приводить к отрицательному числу. - person Jens; 24.11.2015