Sto aggiungendo questa risposta che è simile alla risposta sopra, ma è un modo leggermente diverso di guardare le cose, quindi potrebbe aiutare qualcuno.
Supponiamo di prendere il numero 1111 (in binario) e di sottrarre 1 da esso, otteniamo 1110 e amp; sottraendo 1, otteniamo 1101 e vediamo un pattern emergere, cioè per sottrarre 1 da un numero binario capovolgere tutti gli 0 a destra del bit meno significativo '1' a 1 e quindi capovolgere quel '1' per un 0 (supponendo che il bit più significativo sia il bit più a sinistra e il bit meno significativo sia il bit più a destra).
Quindi, supponiamo, abbiamo v = 14, che in binario è 1110, quindi per ottenere v-1, prima capovolgere lo zero a destra di 1 meno significativo a '1', che ci dà 1111 & quindi capovolgi la meno significativa 1 stessa a zero, dandoti 1101.
Ora sappiamo che il numero 'v' e 'v-1' conserverà tutti gli 1 alla sinistra del meno significativo 1 e il resto dei numeri otterrà '& ded' a zero quindi preservando 1 inferiore al numero di bit effettivamente impostato nel numero, cioè nel caso di 1110, v & v-1 = 1100 che ha 1 bit in meno impostato rispetto al suo predecessore. Questo processo si verifica per quanti "1" ci sono come il numero di bit impostati, il cui conteggio viene memorizzato nella variabile count.