Enteros grandes (big integers) en Java

Publicado por

A pesar de que Java (y muchos otros lenguajes de programación) cuenta con diferentes tipos de datos primitivos que, la mayoría de las veces, nos sirven para cumplir las funcionalidades que esperamos de nuestros programas, en algunos casos particulares necesitamos utilizar valores numéricos muy grandes que exceden los 64 bits de las primitivas más grandes del lenguaje. Para esos casos contamos con la clase BigInteger del paquete math que nos permite crear números muy grandes (solamente limitado por la cantidad de memoria disponible en la Java Virtual Machine o JVM).

Ten en mente que estos enteros grandes ocupan más memoria que sus contrapartes primitivas, si puedes utilizar solamente los tipos de dato primitivos nativos de Java, y no es estrictamente necesario que utilices BigInteger, no lo hagas. Así mismo, la forma en que se realizan algunas operaciones con ellos pueden llegar a ser un poco confusa en contraste con el uso de los operadores suma (+), resta (-), multiplicación (*), etc. si aún así consideras que es necesario utilizar enteros grandes en tu programa, sigue leyendo para aprender a hacerlo.

Construcción de un BigInteger

Para comenzar a usar BigInteger tenemos que importar el paquete:

import java.math.BigInteger;

Este paquete permite crear objetos que funcionarán como enteros grandes. Podemos instanciarlos por medio de cualquiera de los 6 diferentes constructores presentes en la clase, en esta nota solamente hablaré de 2 (posiblemente los más usados), si te interesa conocer todos, puedes consultar la documentación oficial aquí.

El primer método es por medio de un arreglo con la representación binaria a complemento a 2 de un entero grande, por ejemplo:

byte[] b = {7, 34};
BigInteger n = new BigInteger(); //n=1826

Con una cadena (String) que representa al número decimal:

//n contendrá el entero grande 123456789876543210
BigInteger n = new BigInteger(“123456789876543210”); 

Los objetos creados de la clase BigInteger son inmutables, es decir, no puedes modificar lo que contienen, en su lugar necesitan ser reasignados:

Ejemplos

import java.math.BigInteger;
public class EjerciciosBigInteger {             
  public static void main(String[] args) {
    big();
  }
    
  public static void big() {
    //ONE es una constante de la clase. TEN y ZERO también disponibles
    BigInteger n = BigInteger.ONE; 
    
    //Suma
    n = n.add(BigInteger.valueOf(9));
            
    //Resta
    n = n.subtract(BigInteger.valueOf(4));
            
    //Multiplicacion
    n = n.multiply(BigInteger.valueOf(10));
            
    //División
    n = n.divide(BigInteger.valueOf(2));
            
    System.out.println(n);
  }
}

Algunos otros métodos muy útiles de la clase son:`

Método Descripción
abs() Regresa el valor absoluto del entero.
and() Aplica la conjunción entre los dos enteros (a & b).
compareTo() Compara dos enteros y devuelve -1, 0 o 1 dependiendo si es menor, igual o mayor.
shortValue(), intValue(), longValue() Convierte el entero grande a la respectiva primitiva (puede haber pérdida de precisión).
mod() Regresa el módulo de los enteros grandes que se usen.
toByteArray() Convierte el entero grande a un arreglo de bytes de la representación a complemento a 2 del número.

Espero que lo visto en esta lección te haya servido. Aprovecho para recordarte de nuevo: si puedes prescindir de enteros grandes en tu programa, tu memoria te lo agradecerá.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *