0
votes

Pourquoi la boucle est exécutée jusqu'à ce que le nombre devienne zéro

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

c

2 commentaires

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 ...


3 Réponses :


0
votes

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


0 commentaires

0
votes

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.

Début: 10011111

  1. 10011110
  2. 10011100
  3. 10011000
  4. 10010000
  5. 10000000
  6. 00000000

Autant que je sache, la valeur d'un nombre entier sans bits actifs ( 00000000 ) est toujours égale à 0 . Ainsi la boucle se termine.


0 commentaires

0
votes

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); 
} 


0 commentaires