Table des matières
aperçu du sujet
Étant donné un entier n, écrivez une fonction pour afficher le nombre de 1 dans la représentation binaire de 32 bits (les nombres négatifs sont représentés en complément à deux)
première méthode
Analyse : Lorsque nous calculons la somme de chaque chiffre de 1234, pour chaque chiffre, notre méthode consiste à utiliser 1234%10 pour obtenir 4, puis 1234/10 pour obtenir 123, puis à utiliser 123%10, et ainsi de suite, jusqu'à ce que 1234 devient 0.
De la même manière, pour chaque bit binaire de l'entier, on peut obtenir chaque bit binaire de l'entier par %2,/2
code affiché comme ci-dessous
int NumberOf1(int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
test
#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;
}
Résultats de test
Cependant, lorsque l’entier saisi est négatif, le résultat sera erroné.
Le complément de -1 est 111111111111111111111111111111
Cependant, le résultat est 0. Grâce au débogage, on peut constater que lorsque n est -1, le résultat de n%2 est -1, ce qui n'est pas égal à 1, et la valeur du compte reste inchangée, tandis que le résultat de - 1/2 vaut 0. À ce moment, la boucle se termine.
Dans ce cas, nous pouvons utiliser le type unsigned int pour recevoir n et convertir n en un entier non signé
int NumberOf1(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
Testez à nouveau
Cette fois le résultat est correct
Cependant, pour cette méthode, le type de réception doit être unsigned int
Deuxième méthode
Si n&1 est utilisé, le dernier chiffre de n peut être obtenu, puis décalé vers la droite pour supprimer les chiffres comparés afin d'obtenir le chiffre suivant, boucler 32 fois et obtenir chaque chiffre du binaire
code affiché comme ci-dessous
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;
}
test
Cependant, pour cette méthode, pour supprimer chaque bit du binaire, vous devez boucler 32 fois
méthode trois
Lorsque n&(n-1), le dernier bit 1 du binaire de n peut être supprimé
Par exemple
n = 10, binaire : 1010
n - 1 binaire : 1001
n&(n-1) = 1000
Chaque fois que n&(n-1), supprimez un 1 en binaire, puis lorsque n&(n-1) vaut 0, supprimez tous les 1 dans n
code affiché comme ci-dessous
int NumberOf1(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
test