Bit de parité du code pour un nombre impair de bits

Je suis en train d'essayer de trouver la parité d'un bitstring de sorte qu'elle retourne 1 si x est impair # de 0.
Je ne peux utiliser de base opérations au niveau du bit et de ce que j'ai à ce jour passe la plupart des tests, mais je me demande 2 choses:

  1. Pourquoi x ^ (x + ~1)? Je suis tombé sur ceci, mais il semble vous donner 1 si il y a un nombre impair de bits et d'autre chose si même. Comme 7^6 = 1, car 7 = 0b0111
  2. Est-ce la bonne direction de résolution de problème pour cela? Je suppose que mon problème est issue de la première opération, en particulier (x + ~1) parce qu'il serait de dépassement de certaines complément de 2 numéros. Grâce

Code:

int bitParity(int x) {
    int first = x ^ (x + ~1);
    int second = first ^ 1; //if first XOR gave 1 you'll return 0 here
    int result = !!second;
return result;
}
Où avez-vous trouvé cet algorithme?
n'utilisez pas de int, il y aura débordement et ensuite, c'est un comportement indéfini. Utilisation unsigned et 1u au lieu de cela, voici l'écharpe autour de est bien défini.
Cet algorithme ne fonctionne pas. Elle renvoie 1 pour toutes les valeurs entre 0 et 255.
J'ai pris impair de bits des nombres binaires et XOR d, ET d, et un OU logique avec eux-mêmes moins 1 et XOR a été le seul qui a donné quelque chose d'utile (ou alors j'ai pensé).
Double Possible de bitParity - Trouver un nombre impair de bits en un nombre entier

OriginalL'auteur tippenein | 2011-09-23