De http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
unsigned int v; // count bits set in this (32-bit value)
unsigned int c; // store the total here
c = v - ((v >> 1) & 0x55555555);
c = ((c >> 2) & 0x33333333) + (c & 0x33333333);
c = ((c >> 4) + c) & 0x0F0F0F0F;
c = ((c >> 8) + c) & 0x00FF00FF;
c = ((c >> 16) + c) & 0x0000FFFF;
Edit: Il est vrai qu'il est un peu optimisé qui le rend plus difficile à lire. Il est plus facile à lire que:
c = (v & 0x55555555) + ((v >> 1) & 0x55555555);
c = (c & 0x33333333) + ((c >> 2) & 0x33333333);
c = (c & 0x0F0F0F0F) + ((c >> 4) & 0x0F0F0F0F);
c = (c & 0x00FF00FF) + ((c >> 8) & 0x00FF00FF);
c = (c & 0x0000FFFF) + ((c >> 16)& 0x0000FFFF);
Chaque étape de ces cinq, ajoute des bits voisins en groupes de 1, puis 2, puis 4, etc. La méthode est basée à diviser pour mieux régner.
Dans la première étape, nous additionnons les bits 0 et 1 et mettons le résultat dans le segment de deux bits 0-1, ajoutez les bits 2 et 3 et placez le résultat dans le segment de deux bits 2-3 etc ... Dans la deuxième étape, nous ajoutons ensemble les deux bits 0-1 et 2-3 et mettons le résultat dans un bit de 0-3, additionnez deux bits 4-5 et 6-7 et mettez le résultat à quatre bits 4-7 etc ...
Exemple:
So if I have number 395 in binary 0000000110001011 (0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 1)
After the first step I have: 0000000101000110 (0+0 0+0 0+0 0+1 1+0 0+0 1+0 1+1) = 00 00 00 01 01 00 01 10
In the second step I have: 0000000100010011 (00+00 00+01 01+00 01+10) = 0000 0001 0001 0011
In the fourth step I have: 0000000100000100 ( 0000+0001 0001+0011 ) = 00000001 00000100
In the last step I have: 0000000000000101 ( 00000001+00000100 )
qui est égal à 5, qui est le résultat correct
Merci. Je suis désolé, je ne comprends pas parfaitement pourquoi cela fonctionne. Pouvez-vous expliquer – JAM
J'ai ajouté une explication, il a fallu un certain temps parce que je devais me débrouiller ce qui se passait. +1 à votre question pour me forcer à comprendre: P – iniju
Voir aussi cette réponse, qui passe par cette fonction étape par étape: http://stackoverflow.com/a/15979139/31818 – seh