Algoritmos en C/C++

La manipulación de bits en C y C++

En esta lección vas a activar, desactivar, invertir y comprobar bits de un entero para guardar varios estados de encendido y apagado.

Introducción

Cada bit de un entero puede guardar un valor verdadero o falso. Así, un solo entero sin signo puede contener varias opciones de encendido y apagado independientes, llamadas banderas (flags). Esta técnica de máscaras de bits (bit mask) es muy común en programación de sistemas y en sistemas embebidos.

Puntos importantes

  • Prueba con una entrada vacía, un solo elemento, valores repetidos y datos ya ordenados.
  • Primero haz que el código sea correcto y después optimízalo.
  • En código real, usa preferentemente las funciones ya hechas de la biblioteca estándar.

Ejemplos de código C y C++

C
Ejecutar →
main.c
#include <stdio.h>

int main(void) {
    unsigned flags = 0;
    flags |= 1u << 1;
    flags |= 1u << 3;
    flags ^= 1u << 1;
    printf("flags=%u bit3=%u\n", flags, (flags >> 3) & 1u);
}
Resultado de la ejecución
flags=8 bit3=1
C++
Ejecutar →
main.cpp
#include <bitset>
#include <iostream>

int main() {
    std::bitset<4> flags;
    flags.set(1);
    flags.set(3);
    flags.flip(1);
    std::cout << "flags=" << flags
              << " bit3=" << flags.test(3) << '\n';
}
Resultado de la ejecución
flags=1000 bit3=1

Comparación entre C y C++

La expresión 1u << n crea un número en el que solo el bit n vale 1. El operador |= activa un bit, ^= lo invierte y (flags >> 3) & 1u comprueba el bit 3. Después de activar los bits 1 y 3 y volver a invertir el bit 1, solo queda activado el bit 3, así que flags vale 8. Usa tipos sin signo (unsigned) para que los desplazamientos de bits den resultados predecibles. En C++, std::bitset ofrece métodos explícitos como set() y flip() y muestra el valor en binario.

C

Los bucles, los punteros, las longitudes y los búferes temporales se escriben de forma explícita.

C++

Los iteradores y los algoritmos estándar separan el procesamiento de la forma en que se guardan los datos.

Ejercicios de práctica

Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.

  • Sigue cada comparación en papel.
  • Prueba con valores repetidos y con valores muy grandes y muy pequeños.
  • Mide el tiempo de ejecución de tu código y compáralo con la biblioteca estándar.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos