Quelqu'un peut-il dire pourquoi garde la boucle jusqu'à ce que n devienne zéro .. logique derrière ce code.
# include <stdio.h>
# define bool int
/* Function to get parity of number n. It returns 1
if n has odd parity, and returns 0 if n has even
parity */
bool getParity(unsigned int n)
{
bool parity = 0;
while (n)
{
parity = !parity;
n = n & (n - 1);
}
return parity;
}
/* Driver program to test getParity() */
int main()
{
unsigned int n = 7;
printf("Parity of no %d = %s", n,
(getParity(n)? "odd": "even"));
getchar();
return 0;
}
code de ici
3 Réponses :
En C, la valeur booléenne de tous les entiers sauf zéro est True. Et depuis, l'instruction while teste exactement cela la boucle s'exécute jusqu'à ce que la valeur de n soit zéro. Une fois que n est égal à zéro, la boucle n'est pas saisie du tout.
Si votre question est de savoir pourquoi le n diminue jusqu'à zéro.
Les et ( & ) au niveau du bit entre deux entiers non signés créent toujours une valeur inférieure ou égale au plus petit de deux. Ce nombre inférieur est ensuite attribué à n lui-même, donc, n diminue jusqu'à zéro.
Quelques exemples
1111 & 0111 = 0111
0101 & 1010 = 0000
0100 & 0101 = 0100
L'astuce repose sur cette opération binaire:
n = n & (n - 1);
Selon votre site Web, il supprimera ( 1 -> 0 ) le bit actif le plus à droite de la valeur précédente de n . La boucle continuera jusqu'à ce que tous les bits actifs soient désactivés.
Par exemple, si votre numéro n contient 6 bits actifs ( n = 159 -> 10011111 ), il faudra 6 boucles pour les annuler tous. p>
Début: 10011111
10011110 10011100 10011000 10010000 10000000 00000000 Autant que je sache, la valeur d'un nombre entier sans bits actifs ( 00000000 ) est toujours égale à 0 . Ainsi la boucle se termine.
Je ne sais pas si évaluer la parité en utilisant cette boucle est une exigence (mais, en pratique, ce n'est pas la meilleure façon d'évaluer la parité).
Un nombre est impair si son dernier bit est 1, c'est même le contraire. Pour cette raison, il n'y a aucune raison de boucler. Vous pouvez simplement:
bool getParity(unsigned int n)
{
return (bool)(n & 0x00000001 );
}
Ou, alternativement
bool getParity(unsigned int n)
{
return (bool)(n%2);
}
Le site a aussi des explications.
Savez-vous ce qu'est la parité?! le nombre de bits mis à modulo 2, éventuellement inversé. S'il ne reste plus que bits mis à zéro , il n'y a rien à compter ...