Tabla de contenido
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