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; }
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; }
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; }
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