[Pregunta fácil del día] Encuentre el número de unos en el sistema binario: tres ideas muy inteligentes para resolver problemas

Tabla de contenido

 1. Introducción al tema

2. Ideas para resolver problemas 

1. El primer método de resolución de problemas.

2. El segundo método para resolver el problema.

3. El tercer método de resolución de problemas.


 1. Introducción al tema

Enlace de pregunta original: Número de unos en binario

2. Ideas para resolver problemas 

1. El primer método de resolución de problemas.

En números decimales , como 1479, siempre que continúe operando %10 y /10, puede obtener todos los dígitos de 1479.

También es factible extender este método a binario . Siempre que se realicen operaciones continuas de %2 y /2, también se puede extraer cada bit del binario para juzgar cada bit y registrar el número de unos.

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

int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = count_num_of_1(num);
	printf("%d\n", ret);
	return 0;
}

    Por supuesto, no crea felizmente que ha terminado aquí: cuando num es un número negativo, encontrará que el resultado es incorrecto, como num = -1. Cuando num es -1, num%2! = 0, por lo que se omite if y se ejecuta directamente num /=2. Si num es 0, salta del bucle y devuelve count=0. En realidad, -1 almacena el código del complemento en la memoria, es decir, 32 unos.

    Si no comprende el complemento del código original, puede leer mis blogs anteriores, por lo que no entraré en detalles aquí.

[Lenguaje C] Operadores de desplazamiento y binarios enteros_blog-CSDN de Hacynn icono-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/132767057?spm=1001.2014.3001.5502

Solución : Cambie int n a unsigned int n en el parámetro de función count_num_of_1 , que es un tipo entero sin signo . De esta manera, cuando num = -1, n pensará que num no es -1 sino un número binario que es todo 1 (es decir, 4294967295). En este momento, el conteo será 32.

 

2. El segundo método para resolver el problema.

El segundo método es encontrar el número de unos cambiando, sumando &1 a cada bit de la secuencia binaria, y cuando el resultado sea 1, cuente++. Lo siguiente toma 15 como ejemplo:

int count_num_of_1(unsigned int n)
{
	int count = 0;
	int i = 0;
	for ( i = 0; i < 32; i++)
	{
		if (((n >> i) & 1) == 1)
			count++;
	}
	return count;
}

3. El tercer método de resolución de problemas.

 Los dos primeros métodos de resolución de problemas en realidad no son muy eficientes. Aquí hay un método muy inteligente que es tan inteligente que apenas podemos imaginarlo. El núcleo de este método es n = n & (n - 1). Los siguientes usan 15 como ejemplo para explicar:

n = n & (n - 1) puede entenderse como : siempre que se ejecute una vez, habrá un 1 menos en la secuencia binaria de n.

Entonces, encontrar el número de unos en binario se convierte en cuántas veces se puede ejecutar n = n & (n - 1). Siempre que sepa cuántas veces se ejecuta n = n & (n - 1), puede saber cuántas veces que hay en la secuencia binaria del n.1.

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

 Con esto finaliza la explicación de este tema. Si cree que la escritura del autor es buena, dale un gran visto bueno al autor para que me apoye. ¡Su apoyo es mi mayor motivación para actualizar!

 

Supongo que te gusta

Origin blog.csdn.net/zzzzzhxxx/article/details/132776613
Recomendado
Clasificación