Buscaba copypasta, encontré conocimiento. La entrada trata sobre mi experiencia personal, por lo que comparto link al documento de Stanford, para los que llegaron aquí buscando como hacerlo: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
// Peso de Hamming adaptado para StepMania AMX
unsigned char GetNumSetCols()
{
unsigned short uTapNotes = uCols;
uTapNotes = uTapNotes - ((uTapNotes >> 1) & 0x5555);
uTapNotes = (uTapNotes & 0x3333) + ((uTapNotes >> 2) & 0x3333);
return (((uTapNotes + (uTapNotes >> 4)) & 0x0F0F) * 0x0101) >> 8;
}
En el proceso de reescribir el motor del StepMania AMX para utilizar la menor cantidad de recursos me topé ante una situación incómoda, no se me ocurría alguna forma que no utilizara muchos recursos para contar el número de bits establecidos en un byte, por ej. 5 en binario es 0101 y tiene 2 bits establecidos (o sea con 1), y en el caso específico del SMA, el byte que guarda la información de qué columnas se están utilizando. En mi búsqueda por una solución rápida, me encontré con los Teoremas de Hamming, mas específicamente hablando el peso de Hamming.
Cuando vi el código en StackOverflow me quedé con cara de WTF, especialmente porque en los comentarios decía “It’s write-only code. Just put a comment that you are not meant to understand or maintain this code, just worship the gods that revealed it to mankind.” y yo dije “como chingaos no debo entenderlo? ¬¬” y me puse a leer un poco sobre el tema.
En pocas palabras este algoritmo va moviendo los bits en segmentos de 1, 2, 4, 8, etc. bits hasta que quedan en un segmento que podemos interpretar como variable, en mi caso un unsigned char
.