Medio · Bits y arrays

Representación binaria

Imprime un entero positivo en binario: 5 → 101. Prohibido usar cadenas — el camino elegante saca bits con % 2, los guarda en un array y lo imprime al revés.

En una frasePela bits con n % 2 en un array e imprime el array al revés: los bits salen del menos significativo al más, así que invertir el orden es obligatorio.

El problema

Entrada: un entero positivo N (1 ≤ N ≤ 1023).

Salida: la representación binaria de N, sin ceros a la izquierda.

Ejemplos:

EntradaSalida
5101
81000

Tu solución

main.cpp — tu solución
Entrada personalizada para «Ejecutar mi entrada»

La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.

¿Atascado? Pistas

Pista 1 — binario es trocear en otra base

Ya troceas dígitos decimales con % 10 y / 10 (Suma de los dígitos). El binario trocea bits con % 2 y / 2: 5 → 1, 2 → 0, 1 → 1, y 0 corta. El orden de salida: 101 al revés es… aquí ya sale bien — pero prueba con 8.

Pista 2 — por qué el 8 rompe la impresión directa

El 8 suelta 0, 0, 0, 1 — el bit menos significativo primero. Imprimir directo da 0001; la respuesta es 1000. Así que guarda cada bit en un array (bits[k++] = n % 2;) y recorre de k-1 hacia 0. Con N ≤ 1023 bastan ~10 casillas (10 bits).

Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int bits[16];
    int k = 0;
    while (n > 0) {
        bits[k++] = n % 2;
        n /= 2;
    }
    for (int i = k - 1; i >= 0; i--) {
        cout << bits[i];
    }
    cout << endl;
    return 0;
}

Este truco de guardar-y-imprimir-al-revés es exactamente cómo funciona conceptualmente Invertir un número — el array solo hace explícita la inversión. En un compilador de escritorio, el mismo trabajo es una línea: cout << bitset<8>(n);. Meta extra: octal (base 8 — cambian dos caracteres) o cualquier base hasta 10.

Análisis profundo

Por qué funciona

El mismo bucle de arrancar dígitos que en decimal, con base 2 en vez de 10. Eso demuestra que la conversión de base es un algoritmo con un parámetro, no una familia de algoritmos.

El coste

O(log₂ n): como mucho 32 vueltas para un int.

Dónde falla

  • Extraer bits e imprimirlos al momento los saca del menos significativo al más. Recoge y luego imprime al revés.
  • n % 2 sobre un negativo es negativo en C++. Trabaja con unsigned o con abs.

Siguiente paso

Cuenta lo que acabas de extraer: Contar bits 1.

Dos cosas para recordar

  • Convertir de base es un bucle con un parámetro.
  • Los bits salen del menos significativo: hay que invertir.
🐞 Esta versión falla: ábrela y pruébala

Imprime los bits del menos significativo al más

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    while (n > 0) {
        cout << n % 2;
        n /= 2;
    }
    cout << endl;
    return 0;
}