2017-05-22 1 views
2

J'écris un programme utilisant des opérateurs bit à bit en C. C'est pour une affectation scolaire et l'objectif est de compter le nombre de 1 dans la représentation binaire d'un entier, puis imprimer " Même "si le résultat est pair et" impair "si c'est impair.Utilisation des opérateurs bit à bit pour compter le nombre de

J'ai écrit un programme pour parcourir chaque bit et comparer l'entier entré avec un masque et incrémenter une variable de compteur pour chaque fois que l'opérateur AND bit à bit renvoie 1. Cependant, le programme ne semble pas incrémenter la variable compteur . Voici le code:

#include <stdio.h> 

void bitsEvenOrOdd(int value); 

int main(void) { 
    int integer; 

    printf("Enter an integer: "); 
    scanf("%d", &integer); 

    bitsEvenOrOdd(integer); 

    return 0; 
} 

void bitsEvenOrOdd(int value) { 
    unsigned int displayMask; 
    unsigned int i; 
    unsigned int counter; 

    counter = 0; 
    displayMask = 1 << 31; 

    for (i = 0; i < 32; i++) { 
     if ((value & displayMask) == 1) { 
      counter++; 
     } 
     value <<= 1; 
    } 

    if ((counter % 2) == 0) { 
     printf("The total number of 1's in the bit representation is even.\n"); 
    } 
    else { 
     printf("The total number of 1's in the bit representation is odd.\n"); 
    } 
} 

Des conseils ou des astuces sont très appréciés. Je vous remercie!

+1

Si vous avez seulement d'imprimer pair/impair, vous ne même pas les compter, vous pouvez directement déterminer la (http [parité]: // stackoverflow .com/a/21618038/555045) – harold

+3

Copie possible de [Comment vérifier si la valeur a une parité paire ou impaire?] (http://stackoverflow.com/questions/21617970/how-to-check-if-value -has-pair-parity-of-bits-or-impair) – harold

+0

'int value' ==>' valeur non signée'. Le décalage d'un bit de 'int' dans le bit de signe est un comportement indéfini. –

Répondre

3

if ((value & displayMask) == 1) {

Tenir compte cette opération. displayMask est 0x80000000. Bitwise et entre ce nombre et tout autre nombre ne peut être 0x80000000 ou 0. Vous le comparez à 1.

Soit comparer si ce n'est pas égal à 0 ou (je le recommande), vérifier le bit le plus bas et passer à droite au lieu de gauche.

0

Vous déplacer dans le mauvais sens:

value >>= 1; 

En supposant un int est 32 bits, displayMask = 1 << 31 définit le plus haut niveau mais displayMask. Lorsque vous avez quitté cette valeur de 1, le bit à un seul bit est déplacé, de sorte que votre masque est maintenant 0.

Passez à un décalage vers la droite.

value >>= 1; 

Votre comparaison est incorrecte:

if ((value & displayMask) == 1) { 

Ce sera vrai que si le masque est 1 et le bit de poids faible est réglé. Au lieu de cela, vérifier si le résultat est différent de zéro:

if ((value & displayMask) != 0) { 
0

Regardez la ligne

if((value & displayMask) == 1) 

et considérer ce qui se passe quand displayMask est 2, 4, 8, etc.

0

Vous devez vérifier le bit le plus bas pour résoudre le problème. Considérez le changement ci-dessous dans votre code

  unsigned int counter; 

     counter = 0; 
    - displayMask = 1 << 31; 
    + displayMask = 1; 

     for (i = 0; i < 32; i++) { 
     if ((value & displayMask) == 1) { 
     counter++; 
     } 
    -  value <<= 1; 
    +  value >>= 1; 
    } 

if ((counter % 2) == 0) { 
0
unsigned 
count_ones(unsigned u) { 
    unsigned foo=u; 
    do while(foo-=u>>=1, u); 
    return foo; 
}