Cuente el número de unos en binario (lenguaje C)

Tabla de contenido

descripción general del tema

método uno

Método dos

método tres


descripción general del tema

Dado un número entero n, escriba una función para generar el número de unos en la representación binaria de 32 bits (los números negativos se representan en complemento a dos)

método uno

Análisis: cuando calculamos la suma de cada dígito de 1234, para cada dígito, nuestro método es usar 1234%10 para obtener 4, luego 1234/10 para obtener 123, y luego usar 123% 10, y así sucesivamente, hasta 1234 se convierte en 0.

De la misma manera, para cada bit binario del entero, podemos obtener cada bit binario del entero mediante %2,/2

El código se muestra a continuación.

int NumberOf1(int n)
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			count++;
		}
		n /= 2;
	}
	return count;
}

prueba

#include <stdio.h>

int NumberOf1(int n)
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			count++;
		}
		n /= 2;
	}
	return count;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = NumberOf1(n);
	printf("%d的二进制中1的个数为%d", n, ret);
	return 0;
}

Resultados de la prueba

 

 Sin embargo, cuando el número entero de entrada es negativo, el resultado será incorrecto

 El complemento de -1 es 111111111111111111111111111111

Sin embargo, el resultado es 0. A través de la depuración, se puede encontrar que cuando n es -1, el resultado de n%2 es -1, que no es igual a 1, y el valor de conteo permanece sin cambios, mientras que el resultado de - 1/2 es 0. En este momento, el ciclo sale.

 Para este caso, podemos usar el tipo int sin signo para recibir n y convertir n en un entero sin signo

int NumberOf1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			count++;
		}
		n /= 2;
	}
	return count;
}

prueba de nuevo

Esta vez el resultado es correcto.

Sin embargo, para este método, el tipo de recepción debe ser unsigned int

Método dos

Si usa n&1, puede obtener el último dígito de n, luego moverse hacia la derecha, eliminar los dígitos comparados, obtener el siguiente dígito, realizar un bucle 32 veces y obtener todos los dígitos del binario.

El código se muestra a continuación.

int NumberOf1(int n)
{
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		//将n向右移动i位,再&1
		if (((n >> i) & 1) == 1)
		{
			count++;
		}
	}
	return count;
}

prueba

 

 Sin embargo, para este método, para eliminar cada bit del binario, debes realizar un bucle 32 veces.

método tres

Cuando n&(n-1), el último bit 1 del binario de n se puede eliminar

Por ejemplo

norte = 10, binario: 1010

norte - 1 binario: 1001

n&(n-1) = 1000

Cada vez que n&(n-1), elimina un 1 en binario, luego, cuando n&(n-1) es 0, elimina todos los 1 en n

El código se muestra a continuación.

int NumberOf1(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

prueba

 

Supongo que te gusta

Origin blog.csdn.net/2301_76161469/article/details/131055280
Recomendado
Clasificación