Activar bits en un entero en C

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo contar el número de bits activados (1's) en un entero utilizando operaciones a nivel de bits en el lenguaje de programación C. El laboratorio consta de tres pasos: leer una entrada entera, utilizar operaciones a nivel de bits para contar los bits activados y mostrar el recuento. Al final de este laboratorio, tendrás una mejor comprensión de la teoría de números y los conceptos de matemáticas discretas, y cómo aplicarlos en la programación en C.

El laboratorio comienza demostrando cómo leer una entrada entera del usuario, que es el primer paso en el ejercicio de conteo de bits. Luego, se presenta una función que utiliza operaciones a nivel de bits para contar el número de bits activados en el entero dado. Finalmente, el programa muestra el recuento de bits activados al usuario.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/while_loop("While Loop") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435171{{"Activar bits en un entero en C"}} c/operators -.-> lab-435171{{"Activar bits en un entero en C"}} c/while_loop -.-> lab-435171{{"Activar bits en un entero en C"}} c/user_input -.-> lab-435171{{"Activar bits en un entero en C"}} c/output -.-> lab-435171{{"Activar bits en un entero en C"}} end

Leer un entero

En este paso, aprenderás cómo leer una entrada entera en la programación en C para contar los bits activados. Crearemos un programa sencillo que demuestre la entrada de un entero.

Primero, creemos un archivo fuente C para nuestro programa de conteo de bits:

cd ~/project
nano bit_counter.c

Ahora, agrega el siguiente código al archivo:

#include <stdio.h>

int main() {
    int number;

    // Prompt the user to enter an integer
    printf("Enter an integer: ");

    // Read the integer input
    scanf("%d", &number);

    // Display the entered number
    printf("You entered: %d\n", number);

    return 0;
}

Compilemos y ejecutemos el programa:

gcc bit_counter.c -o bit_counter
./bit_counter

Ejemplo de salida:

Enter an integer: 42
You entered: 42

Explicación del código:

  • #include <stdio.h> incluye la biblioteca estándar de entrada/salida
  • scanf("%d", &number) lee una entrada entera del usuario
  • printf() se utiliza para mostrar mensajes y el número ingresado
  • %d es el especificador de formato para enteros

Este sencillo programa demuestra cómo leer una entrada entera, que es el primer paso en nuestro ejercicio de conteo de bits activados.

Usar operaciones a nivel de bits para contar unos

En este paso, aprenderás cómo contar el número de bits activados (1's) en un entero utilizando operaciones a nivel de bits en C.

Modifiquemos el archivo bit_counter.c anterior para implementar el conteo de bits:

cd ~/project
nano bit_counter.c

Reemplace el contenido anterior con el siguiente código:

#include <stdio.h>

// Function to count set bits using bitwise AND operation
int countSetBits(int number) {
    int count = 0;

    while (number) {
        // Check the least significant bit
        count += number & 1;

        // Right shift the number
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // Prompt the user to enter an integer
    printf("Enter an integer: ");
    scanf("%d", &number);

    // Count and display the number of set bits
    int setBitCount = countSetBits(number);
    printf("Number of set bits in %d: %d\n", number, setBitCount);

    return 0;
}

Compile y ejecute el programa:

gcc bit_counter.c -o bit_counter
./bit_counter

Ejemplo de salida:

Enter an integer: 42
Number of set bits in 42: 3

Explicación del código:

  • La función countSetBits() utiliza operaciones a nivel de bits para contar los bits activados
  • number & 1 comprueba el bit menos significativo (devuelve 1 si el bit está activado, 0 en caso contrario)
  • number >>= 1 desplaza el número hacia la derecha, pasando al siguiente bit
  • El bucle continúa hasta que se hayan comprobado todos los bits

Desglose de la operación a nivel de bits:

  • 42 en binario es 101010
  • Posiciones de los bits: 1 0 1 0 1 0
  • Recuento de bits activados: 3

Este método cuenta de manera eficiente el número de 1's en un entero utilizando un mínimo de pasos computacionales.

Mostrar el recuento

En este último paso, mejoraremos nuestro programa de conteo de bits para proporcionar una salida más detallada y demostrar diferentes formas de mostrar el recuento de bits activados.

Modifiquemos el archivo bit_counter.c para agregar una impresión más completa:

cd ~/project
nano bit_counter.c

Actualicemos el código con la siguiente implementación:

#include <stdio.h>

// Function to count set bits using bitwise AND operation
int countSetBits(int number) {
    int count = 0;

    while (number) {
        count += number & 1;
        number >>= 1;
    }

    return count;
}

int main() {
    int number;

    // Prompt the user to enter an integer
    printf("Enter an integer: ");
    scanf("%d", &number);

    // Count the number of set bits
    int setBitCount = countSetBits(number);

    // Print the count in multiple formats
    printf("Decimal Number: %d\n", number);
    printf("Binary Representation: ");

    // Print binary representation
    for (int i = 31; i >= 0; i--) {
        int bit = (number >> i) & 1;
        printf("%d", bit);
    }
    printf("\n");

    // Print set bit count results
    printf("Number of Set Bits: %d\n", setBitCount);
    printf("Set Bit Percentage: %.2f%%\n",
           (float)setBitCount / 32 * 100);

    return 0;
}

Compile y ejecute el programa:

gcc bit_counter.c -o bit_counter
./bit_counter

Ejemplo de salida:

Enter an integer: 42
Decimal Number: 42
Binary Representation: 00000000000000000000000000101010
Number of Set Bits: 3
Set Bit Percentage: 9.38%

Explicación del código:

  • Se agregó la impresión de la representación binaria
  • Se incluyó el cálculo del porcentaje de bits activados
  • Se utilizaron operaciones a nivel de bits para extraer bits individuales
  • Se formateó la salida para proporcionar múltiples perspectivas sobre el recuento de bits

El programa ahora ofrece una vista completa de la composición de bits del entero, mostrando:

  • Valor decimal
  • Representación binaria de 32 bits completa
  • Número total de bits activados
  • Porcentaje de bits activados

Resumen

En este laboratorio, primero aprendiste cómo leer una entrada entera en la programación en C. Esto implicó utilizar la función scanf() para capturar la entrada del usuario y la función printf() para mostrar el número ingresado. A continuación, implementaste una función llamada countSetBits() que utiliza operaciones a nivel de bits para contar el número de bits activados (1's) en el entero dado. Esta función itera a través de los bits del número, comprueba el bit menos significativo utilizando la operación AND a nivel de bits y luego desplaza el número hacia la derecha para pasar al siguiente bit. El recuento de bits activados se acumula y se devuelve.