Programa en C para contar ceros y unos en representación binaria de un número

Dado un número N , la tarea es escribir un programa C para contar el número de 0 y 1 en la representación binaria de N.

Ejemplos:  

Entrada: N = 5 
Salida: 
Cuenta de 0s: 1 
Cuenta de 1s: 2 
Explicación: La representación binaria de 5 es “101”.
Entrada: N = 22 
Salida: 
Cuenta de 0s: 2 
Cuenta de 1s: 3 
Explicación: La representación binaria de 22 es “10110”. 

Método 1: enfoque ingenuo: la idea es iterar a través de todos los bits en la representación binaria de N e incrementar la cuenta de 0s si el bit actual es ‘0’; de lo contrario, incrementar la cuenta de 1s .

A continuación se muestra la implementación del enfoque anterior:

C

// C program for the above approach
#include <stdio.h>
 
// Function to count the number of 0s
// and 1s in binary representation of N
void count1s0s(int N)
{
    // Initialise count variables
    int count0 = 0, count1 = 0;
 
    // Iterate through all the bits
    while (N > 0) {
 
        // If current bit is 1
        if (N & 1) {
            count1++;
        }
 
        // If current bit is 0
        else {
            count0++;
        }
 
        N = N >> 1;
    }
 
    // Print the count
    printf("Count of 0s in N is %d\n", count0);
    printf("Count of 1s in N is %d\n", count1);
}
 
// Driver Code
int main()
{
    // Given Number
    int N = 9;
 
    // Function Call
    count1s0s(N);
    return 0;
}
Producción

Count of 0s in N is 2
Count of 1s in N is 2

Complejidad de tiempo: O (log N)

Método 2: enfoque recursivo: el enfoque anterior también se puede implementar mediante recursividad

A continuación se muestra la implementación del enfoque anterior:

C

// C program for the above approach
#include <math.h>
#include <stdio.h>
 
// Recursive approach to find the
// number of set bit in 1
int recursiveCount(int N)
{
 
    // Base Case
    if (N == 0) {
        return 0;
    }
 
    // Return recursively
    return (N & 1) + recursiveCount(N >> 1);
}
 
// Function to find 1s complement
int onesComplement(int n)
{
    // Find number of bits in the
    // given integer
    int N = floor(log2(n)) + 1;
 
    // XOR the given integer with
    // pow(2, N) - 1
    return ((1 << N) - 1) ^ n;
}
 
// Function to count the number of 0s
// and 1s in binary representation of N
void count1s0s(int N)
{
    // Initialise the count variables
    int count0, count1;
 
    // Function call to find the number
    // of set bits in N
    count1 = recursiveCount(N);
 
    // Function call to find 1s complement
    N = onesComplement(N);
 
    // Function call to find the number
    // of set bits in 1s complement of N
    count0 = recursiveCount(N);
 
    // Print the count
    printf("Count of 0s in N is %d\n", count0);
    printf("Count of 1s in N is %d\n", count1);
}
 
// Driver Code
int main()
{
    // Given Number
    int N = 5;
 
    // Function Call
    count1s0s(N);
    return 0;
}
Producción

Count of 0s in N is 1
Count of 1s in N is 2

Complejidad de tiempo: O (log N)

Método 3: uso del algoritmo de Brian Kernighan. 
Podemos encontrar el recuento de bits establecidos siguiendo los pasos a continuación: 

  • Inicializar cuenta a 0 .
  • Si N > 0 , actualice N como N & (N – 1) ya que esto desactivará el bit más establecido desde la derecha, como se muestra a continuación:
if N = 10;
Binary representation of N     = 1010
Binary representation of N - 1 = 1001
-------------------------------------
Logical AND of N and N - 1     = 1000
  • Incremente el conteo de los pasos anteriores y repita los pasos anteriores hasta que N se convierta en 0.

Para encontrar el conteo de 0s en la representación binaria de N , encuentre el complemento a uno de N y encuentre el conteo de bits establecidos utilizando el enfoque discutido anteriormente.

A continuación se muestra la implementación del enfoque anterior: 

C

// C program for the above approach
#include <math.h>
#include <stdio.h>
 
// Function to find 1s complement
int onesComplement(int n)
{
    // Find number of bits in the
    // given integer
    int N = floor(log2(n)) + 1;
 
    // XOR the given integer with
    // pow(2, N) - 1
    return ((1 << N) - 1) ^ n;
}
 
// Function to implement count of
// set bits using Brian Kernighan’s
// Algorithm
int countSetBits(int n)
{
    // Initialise count
    int count = 0;
 
    // Iterate until n is 0
    while (n) {
        n &= (n - 1);
        count++;
    }
 
    // Return the final count
    return count;
}
 
// Function to count the number of 0s
// and 1s in binary representation of N
void count1s0s(int N)
{
    // Initialise the count variables
    int count0, count1;
 
    // Function call to find the number
    // of set bits in N
    count1 = countSetBits(N);
 
    // Function call to find 1s complement
    N = onesComplement(N);
 
    // Function call to find the number
    // of set bits in 1s complement of N
    count0 = countSetBits(N);
 
    // Print the count
    printf("Count of 0s in N is %d\n", count0);
    printf("Count of 1s in N is %d\n", count1);
}
 
// Driver Code
int main()
{
    // Given Number
    int N = 5;
 
    // Function Call
    count1s0s(N);
    return 0;
}
Producción

Count of 0s in N is 1
Count of 1s in N is 2

Complejidad de tiempo: O (log N)

Publicación traducida automáticamente

Artículo escrito por kartikey134 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *