2011-05-04 11 views
22

He estado buscando por un buen tiempo, y no he encontrado casi nada sobre cómo BigInteger realmente tiene sus números. ¿Son una variedad de caracteres? ¿Algo más? ¿Y cómo se convierten los datos a/desde BigInteger?¿Cómo almacena BigInteger sus datos?

Por lo que he encontrado, supongo que todas las clases de precisión arbitrarias, como BigInteger y BigDecimal, contienen datos como una matriz de caracteres. ¿Es así como realmente funciona? ¿O es solo una suposición de la gente?

Pregunto porque he estado trabajando en mi propia implementación de algo como BigInteger, pero no puedo encontrar la forma de mantener números mayores que Long.MAX_VALUE (no recuerdo el número real).

Gracias de antemano.

+3

Recuerde que una implementación es libre de hacer lo que quiera, siempre y cuando se mantenga el contrato 'BigInteger' del JDK. Puede revisar la fuente completa del Sun JDK si lo intenta con la intensidad suficiente: Oracle ha hecho que sea más difícil de lo que solía ser, pero aún es posible; [comenzar aquí] (http://java.sun.com/j2se/1.5.0/source_license.html). Puede navegar por la versión de OpenJDK [aquí] (http://hg.openjdk.java.net/jdk6/jdk6-gate/jdk/file/tip/src/share/classes/java/math/BigInteger.java) (it también usa 'int []'). –

Respuesta

16

Con una int[]

Desde la fuente:

/** 
* 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; 
+0

@glowcoder Gracias por la respuesta, pero ¿hay algún otro detalle para ello? ¿Cómo se convierte una entrada a esa matriz? – Jon

+0

En términos sencillos ... (en esa implementación particular) * la representación del número de bits se empaqueta en una matriz de int *. –

+0

(El complemento de dos internamente no se usa, aunque 'valueOf (int [])' aceptará la entrada en complemento a dos). –

0

La forma más común de representar números es mediante el uso del sistema de notación posicional. Los números se escriben usando dígitos para representar múltiplos de potencias de la base especificada. La base con la que estamos más familiarizados y usamos todos los días, es la base 10. Cuando escribimos el número 12345 en la base 10, en realidad significa: 12345 = 1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10^1 + 5 * 10^0

Continued here...

+3

Eso es para una clase entera grande de C#. Esto es en referencia a la clase 'java.math.BigInteger'. – corsiKa

+0

FWIW, esa tampoco es la forma en que C# almacena BigIntegers. –

-1

Hay muchas maneras de representar grandes números enteros. Las cadenas de caracteres son simples, y cualquiera que haya hecho una división larga con lápiz y papel puede escribir las rutinas aritméticas .

+5

El OP preguntó cómo funciona 'BigInteger', no cómo podría * hacerlo *. –

Cuestiones relacionadas