Compter le nombre de 1 en binaire (langage C)

Table des matières

aperçu du sujet

première méthode

Deuxième méthode

méthode trois


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

 

Je suppose que tu aimes

Origine blog.csdn.net/2301_76161469/article/details/131055280
conseillé
Classement