Table des matières
2. Idées de résolution de problèmes
1. La première méthode de résolution de problèmes
2. La deuxième méthode pour résoudre le problème
3. La troisième méthode de résolution de problèmes
1. Introduction au sujet
Lien de la question d'origine : Nombre de 1 en binaire
2. Idées de résolution de problèmes
1. La première méthode de résolution de problèmes
En nombres décimaux , comme 1479, tant que vous continuez à utiliser %10 et /10, vous pouvez obtenir tous les chiffres de 1479.
Il est également possible d'étendre cette méthode au binaire . Tant que grâce aux opérations continues %2 et /2, vous pouvez également supprimer chaque bit du binaire, jugeant ainsi chaque bit et enregistrant le nombre de 1.
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;
}
Bien sûr, ne pensez pas que vous avez terminé ici. Lorsque num est un nombre négatif, vous constaterez que le résultat est faux, comme num = -1. Lorsque num est -1, num%2 != 0, donc if est ignoré et num /=2 est exécuté directement. Si num est 0, il sort de la boucle et renvoie count=0. En réalité, -1 stocke le code complément en mémoire, soit 32 uns.
Si vous ne comprenez pas le complément du code original, vous pouvez lire mes précédents blogs, je n'entrerai donc pas dans les détails ici.
Solution : Remplacez int n par unsigned int n dans le paramètre de fonction count_num_of_1 , qui est un type entier non signé . De cette façon, lorsque num = -1, n pensera que num n'est pas -1 mais un nombre binaire qui est entièrement 1 (c'est-à-dire 4294967295). À ce moment, le compte sera 32.
2. La deuxième méthode pour résoudre le problème
La deuxième méthode consiste à trouver le nombre de 1 en décalant, en ajoutant &1 à chaque bit de la séquence binaire, et lorsque le résultat est 1, comptez++. Ce qui suit prend 15 comme exemple :
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. La troisième méthode de résolution de problèmes
Les deux premières méthodes de résolution de problèmes ne sont en fait pas très efficaces. Voici une méthode très intelligente , si intelligente qu'on peut à peine l'imaginer. Le cœur de cette méthode est n = n & (n - 1). Ce qui suit utilise 15 à titre d'exemple pour expliquer:
n = n & (n - 1) peut être compris comme : tant qu'il est exécuté une fois, il y aura un 1 de moins dans la séquence binaire de n.
Ensuite, trouver le nombre de 1 en binaire devient combien de fois n = n & (n - 1) peut être exécuté. Tant que vous savez combien de fois n = n & (n - 1) est exécuté, vous pouvez savoir combien de fois n = n & (n - 1) peut être exécuté. il y a des fois dans la séquence binaire de n°1.
int count_num_of_1(unsigned int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
Ceci termine l’explication de ce sujet. Si vous pensez que l'écriture de l'auteur est bonne, merci de lui donner un grand bravo pour me soutenir. Votre soutien est ma plus grande motivation pour la mise à jour !