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:
| Entrada | Salida |
|---|---|
5 | 101 |
8 | 1000 |
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 % 2sobre 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;
}