Я довольно долго искал и почти ничего не нашел о том, как BigInteger на самом деле хранит свои числа. Это массив символов? Что-то другое? И как данные конвертируются в / из BigInteger?

Из того, что я обнаружил, я предполагаю, что все классы произвольной точности, такие как BigInteger и BigDecimal, хранят данные в виде массива символов. Так ли это на самом деле работает? Или это просто предположение людей?

Я спрашиваю, потому что я работал над своей собственной реализацией чего-то вроде BigInteger, но не могу понять, как хранить числа, превышающие Long.MAX_VALUE (я не помню фактическое число) .

Заранее спасибо.

38
Jon Egeland 4 Май 2011 в 08:38
3
Помните, что реализация может делать то, что ей нравится, пока она соблюдает контракт JDK BigInteger. Вы можете просмотреть полный исходный код Sun JDK, если будете достаточно стараться - Oracle сделал его труднее, чем раньше, но это все еще возможно; начните здесь. Вы можете просмотреть версию OpenJDK здесь (также используется int[]).
 – 
T.J. Crowder
4 Май 2011 в 08:55

3 ответа

Лучший ответ

С int[]

Из источника:

/**
 * The magnitude of this BigInteger, in <i>big-endian</i> order: the
 * zeroth element of this array is the most-significant int of the
 * magnitude.  The magnitude must be "minimal" in that the most-significant
 * int ({@code mag[0]}) must be non-zero.  This is necessary to
 * ensure that there is exactly one representation for each BigInteger
 * value.  Note that this implies that the BigInteger zero has a
 * zero-length mag array.
 */
final int[] mag;
32
corsiKa 4 Май 2011 в 08:42
2
Спасибо за ответ, но есть ли еще какие-нибудь подробности? Например, как он преобразует входные данные в этот массив?
 – 
Jon Egeland
4 Май 2011 в 08:43
3
С точки зрения непрофессионала ... (в этой конкретной реализации) поразрядное представление числа упаковано в массив int .
 – 
user166390
4 Май 2011 в 08:50
(Внутреннее дополнение до двух не используется - хотя valueOf(int[]) принимает ввод в виде дополнения до двух.)
 – 
user166390
4 Май 2011 в 08:57
1
@glowcoder: Oracle делает все возможное, чтобы люди принимали лицензию до получения доступа к исходному коду. Размещение всего курса в Интернете без этих средств защиты, вероятно, является нарушением авторских прав. Вместо этого просто укажите @Jon на , где он сам может получить копию источника < / а>.
 – 
T.J. Crowder
4 Май 2011 в 09:03
2
@ T.J. Извините, я не увидел там точек. :) Я бы предпочел не использовать @Crowder, так как это тоже фамилия моего менеджера, и мне не хотелось бы путать их (потому что вы мне нравитесь, и я бы предпочел, чтобы так и оставалось!) В любом случае по теме, посмотрел лицензию, и вы абсолютно правы. Я удалил ссылку.
 – 
corsiKa
4 Май 2011 в 10:30

Есть много способов представить большие целые числа. Строки символов просты, и любой, кто когда-либо делал длинное деление карандашом и бумагой, может написать арифметические процедуры.

-2
ddyer 4 Май 2011 в 08:44
11
Оператор спросил, как BigInteger это делает, а не как может это сделать.
 – 
T.J. Crowder
4 Май 2011 в 08:53