HOWTO · Java

Convertir Decimal a Binario en Java

Este tutorial demuestra cómo convertir decimal a binario en Java.

En esta página

Java ofrece Integer.toBinaryString(int) para la conversión habitual de un entero a una cadena binaria. El ejemplo siguiente convierte el entero 50.

Convertir un entero decimal a binario con Java

Usa Integer.toBinaryString para obtener la conversión directa más sencilla. Este programa autónomo convierte el entero 50 e imprime sus dígitos binarios:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

public class DecimalToBinary {
  public static void main(String[] args) {
    int decimal = 50;
    String binary = Integer.toBinaryString(decimal);
    System.out.println(binary);
  }
}

La división repetida manual resulta útil para aprender la conversión posicional, mientras que la extracción bit a bit sirve cuando necesitas mostrar una cantidad determinada de bits. Estos métodos representan los valores negativos de forma distinta, así que elige según necesites el patrón de bits de un int con signo de Java o una cadena con magnitud y signo. El método estándar devuelve una cadena sin ceros iniciales. Para un int no negativo, esa es la representación mínima: el decimal 50 se convierte en 110010. Para un int negativo, Java devuelve la representación en complemento a dos de 32 bits; por ejemplo, el resultado contiene 32 dígitos binarios, en lugar de un signo menos seguido de la magnitud. Si un valor no negativo necesita un ancho de visualización fijo, usa una operación de cadena, como rellenarlo por la izquierda. El relleno cambia la presentación, no el valor del entero.

Convertir manualmente un entero decimal mediante divisiones sucesivas

Para construir los dígitos, divide repetidamente entre dos un valor no negativo y registra cada resto. Los restos aparecen desde el menos significativo hasta el más significativo, así que inviértelos antes de mostrar la cadena. Esta versión trata el cero de forma explícita y representa los valores negativos con un signo menos seguido de los dígitos binarios de la magnitud. Convertir el valor a long antes de obtener su valor absoluto también permite manejar Integer.MIN_VALUE de forma segura.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

public class RepeatedDivision {
  static String toBinary(int value) {
    if (value == 0) {
      return "0";
    }

    boolean negative = value < 0;
    long remaining = Math.abs((long) value);
    StringBuilder digits = new StringBuilder();

    while (remaining > 0) {
      digits.append(remaining % 2);
      remaining /= 2;
    }

    digits.reverse();
    return negative ? "-" + digits : digits.toString();
  }

  public static void main(String[] args) {
    System.out.println(toBinary(33));
    System.out.println(toBinary(-33));
    System.out.println(toBinary(0));
  }
}

Este método manual usa deliberadamente la representación de magnitud con signo para las entradas negativas; el resultado para un valor negativo no tiene el mismo formato que Integer.toBinaryString. StringBuilder crece a medida que aumenta la cantidad de dígitos, por lo que no hace falta recurrir a una matriz de tamaño fijo arbitrario. Si solo necesitas la conversión habitual de enteros de Java, prefiere el método de la biblioteca estándar.

Extraer bits de un entero con operadores bit a bit

La extracción bit a bit te permite elegir el ancho del patrón de bits que se muestra. Empieza por el bit de mayor posición dentro de ese ancho, desplázalo hasta la posición menos significativa y aplica la máscara 1. En este ejemplo, el ancho es de ocho bits y el valor es 13:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

public class FixedWidthBits {
  public static void main(String[] args) {
    int value = 13;
    int width = 8;
    StringBuilder bits = new StringBuilder();

    for (int bit = width - 1; bit >= 0; bit--) {
      bits.append((value >>> bit) & 1);
    }

    System.out.println(bits);
  }
}

El desplazamiento a la derecha sin signo (>>>) y la máscara aíslan cada bit. Un ancho fijo conserva los ceros iniciales en el resultado mostrado, a diferencia de Integer.toBinaryString. Elige un ancho que se ajuste a la representación que quieras mostrar: este bucle presenta los ocho bits menos significativos, por lo que un valor más ancho o negativo se trunca a ese ancho. Para mostrar todos los bits de un int, usa un ancho de Integer.SIZE (32). Es una decisión sobre la representación, no una afirmación de velocidad.

¿Por qué no construir el binario con Math.pow()?

Math.pow() devuelve un double, y tratar los dígitos binarios como posiciones decimales de un entero es poco fiable. Por ejemplo, sumar remainder * Math.pow(10, position) construye un número decimal cuyos caracteres resultan ser 0 y 1; no almacena un valor binario. A medida que aumenta la cantidad de dígitos, ese entero decimal puede superar el rango de int, y las potencias de punto flotante no son una base fiable para construir dígitos de precisión arbitraria. El valor numérico tampoco puede conservar los ceros iniciales: un entero no registra cuántos caracteres cero se pretendían al principio.

Representa los dígitos binarios como una String. Usa Integer.toBinaryString para obtener la representación estándar de enteros de Java, la división repetida para aprender o adaptar la conversión, o la extracción de bits con ancho limitado cuando importe una longitud concreta. Estas opciones hacen explícito el comportamiento con valores con signo y el tratamiento de los ceros iniciales.