Escriba una función que devuelva el número de unos en el número binario del parámetro (incluida la comprensión del complemento a uno del código original, el uso de operadores de desplazamiento, AND bit a bit, OR bit a bit y XOR bit a bit)

Tabla de contenido

tema:

Preparar:

Método 1 (solo para números positivos):

Idea:

respuesta:

Método 2 (universal para números positivos y negativos):

Prefacio:

Primero, echemos un vistazo a los códigos inverso y complemento del código original:

 En segundo lugar, echemos un vistazo al operador de turno << >>:​

Finalmente, echemos un vistazo al operador de bits & | ^:

Bit a bit Y:

​O bit a bit |:  

XOR bit a bit^:​

 resumen: 

Idea:

respuesta:

Método tres (optimización del método dos)

Idea:

 respuesta:



tema:

Escriba una función que devuelva el número de unos en el parámetro binario.

Por ejemplo: 15 0000 1111 4 1

Enlace DO de Niuke.com

Preparar:

Crea una función:

#include<stdio.h>

int CountOne(int num)
{

}

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

Método 1 (solo para números positivos):

Idea:

Cuando queremos calcular una cierta cantidad de parámetros decimales, podemos usar la operación de módulo para hacer que el parámetro sea %10,

Así, se obtiene el último dígito del parámetro, y luego se calcula el parámetro /10, y luego se realiza la operación de módulo...

En binario, también podemos usar el mismo método, necesitamos dejar que el parámetro %2,

Puede obtener el último dígito del parámetro, luego dejar el parámetro/2 y luego realizar la operación de módulo...

Primero veamos cómo contar el número de unos en decimal:

int CountOne(int num)
{
	int count = 0;
	while (num)
	{
		if (num % 10 == 1)
		{
			count++;
		}
		num /= 10;
	}
	return count;
}

respuesta:

Por analogía, podemos escribir para contar el número de unos en binario:

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

 En comparación, no es difícil ver que solo se han cambiado los números después de% y /. De la misma manera, el número de un determinado número en octal también se puede calcular de esta manera.

Método 2 (universal para números positivos y negativos):

Prefacio:

Primero, echemos un vistazo a los códigos inverso y complemento del código original:

 En segundo lugar, echemos un vistazo al operador de turno << >>:

 Por supuesto, las computadoras siempre desplazan el complemento de los números enteros.

Finalmente, echemos un vistazo al operador de bits & | ^:

Bit a bit Y:


Bit a bit O |:  

XOR bit a bit^:

 resumen: 

Sabiendo esto, podemos sacar algunas pequeñas conclusiones:

a&1=1 a|0=a a^0=a a^a=0

Idea:

A través del operador de desplazamiento, podemos encontrar cada bit del parámetro binario para determinar si el resultado de cada bit es 1.

respuesta:

Podemos pensar en mover el parámetro 1 bit cada vez y luego dejar que se le aplique AND bit a bit en 1 para determinar si su valor es 1, pero también sabemos que el operador de desplazamiento no cambiará el valor del parámetro, por lo que podemos mueva el parámetro cada vez que mueva la posición i, cada vez que se mueva i, +1

int CountOne(int num)
{
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		if ((num >> i) & 1) 
			count++;
	}
	return count;
}

Método tres (optimización del método dos)

Idea:

A partir del método dos, podemos saber que se repetirá 32 veces en cualquier momento, entonces, ¿cómo optimizarlo? De hecho, aquí se utiliza un método muy inteligente:

Cuando la secuencia binaria n se convierte en n-1, el último 1 se convertirá en 0. Cuando n&(n-1), debido a que los últimos dígitos son diferentes, el último 1 se cambiará a 0 y el ciclo se repetirá hasta Cuando n sea 0 , deja de hacer bucles. Tomemos 15 como ejemplo:

 respuesta:

int CountOne(int num)
{
	int count = 0;
	while (num)
	{
		count++;
		num = num & (num - 1);
	}
	return count;
}

Supongo que te gusta

Origin blog.csdn.net/m0_75186846/article/details/131991699
Recomendado
Clasificación