#java #biginteger
#java #biginteger
Вопрос:
Я довольно долго искал и почти ничего не нашел о том, как BigInteger
на самом деле хранятся его числа. Являются ли они массивом символов? Что-то еще? И как данные преобразуются в / из BigInteger
?
Из того, что я нашел, я предполагаю, что все классы произвольной точности, такие как BigInteger
и BigDecimal
, содержат данные в виде массива символов. Так ли это на самом деле работает? Или это просто предположение людей?
Я спрашиваю, потому что я работал над своей собственной реализацией чего-то вроде BigInteger
, но я не могу понять, как хранить числа, большие Long.MAX_VALUE
(я не помню фактическое число).
Заранее спасибо.
Комментарии:
1. Помните, что реализация вольна делать то, что ей нравится, до тех пор, пока она придерживается
BigInteger
контракта JDK. Вы можете просмотреть полный исходный код Sun JDK, если достаточно постараетесь — Oracle усложнила его получение, чем раньше, но это все еще возможно; начните здесь . Вы можете просмотреть версию OpenJDK здесь (она также используетint[]
).
Ответ №1:
С помощью 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;
Комментарии:
1. @glowcoder Спасибо за ответ, но есть ли в нем какие-либо другие детали? Например, как он преобразует входные данные в этот массив?
2. С точки зрения непрофессионала… (в этой конкретной реализации) побитовое числовое представление упаковано в массив значений int .
3. (Внутренне дополнение two не используется — хотя
valueOf(int[])
будет принимать входные данные в дополнении two.)4. @glowcoder: Oracle идет на некоторые меры, чтобы гарантировать, что люди принимают лицензию, прежде чем получить доступ к исходному коду. Публикация всего класса в Интернете без этих средств защиты, вероятно, является нарушением авторских прав. Вместо этого просто укажите @Jon на то, где он сам может получить копию исходного кода .
5. @T.J. Извините, я не увидел там точек. 🙂 Я бы предпочел не использовать @Crowder, так как это также фамилия моего менеджера, и я бы не хотел путать их (потому что вы мне нравитесь, и я бы предпочел, чтобы так и оставалось!) В любом случае, по теме, я взглянул на лицензию, и вы абсолютно правы. Я удалил ссылку.
Ответ №2:
Наиболее распространенным способом представления чисел является использование позиционной системы счисления. Числа записываются с использованием цифр для представления кратных степеней указанного основания. База, с которой мы наиболее знакомы и которой пользуемся каждый день, — это база 10. Когда мы записываем число 12345 в базе 10, это фактически означает: 12345 = 1*10^4 2*10^3 3*10^2 4*10^1 5*10^0
Комментарии:
1. Это для класса C # big integer. Это относится к
java.math.BigInteger
классу.2. Черт возьми, C # тоже хранит BigIntegers не так.
Ответ №3:
Существует много способов представления больших целых чисел. Строки символов просты, и любой, кто когда-либо выполнял деление в длину с помощью карандаша и бумаги, может написать арифметические процедуры.
Комментарии:
1. OP спросил, как
BigInteger
это делает, а не как он мог бы это сделать.