num &= num - 1;
cancella il bit meno significativo impostato in num.
Questo algoritmo conta i bit impostati cancellandoli e incrementando un contatore finché non sono scomparsi.
Per capire perché cancella il bit meno significativo, è necessario pensare a cosa decrementare fa ai bit e, naturalmente, a capire cosa fa l'operazione &
.
Sottrarre in opere binarie proprio come il processo in cui eravamo tutti educati in decimale da bambini. Si lavora da destra (meno significativo) a sinistra, semplicemente sottraendo le singole cifre quando possibile e "prendendo in prestito" dalla cifra successiva quando necessario.
Quando si sottrae 1 da un numero binario che termina in un insieme di zeri, questo "prendere in prestito" e sottrarre trasforma tutti gli zeri in posizioni inferiori rispetto all'estrema 1 su 1 all'estrema destra e trasforma l'1o a destra in uno zero (perché è stato preso in prestito).
quindi applicando l'operatore &
lascia tutte le cifre minori zero perché sono zero nel num
, e imposta il bit meno significativo del num
a zero perché è zero nel num-1
.
Entrambe queste operazioni lasciano invariate le cifre più significative.
Ecco un buon elenco di bit twiddling hacks compreso questo, che è dovuto a Brian Kernighan.
fonte
2012-08-04 17:25:57
Si noti che questo è anche noto come conteggio della popolazione o peso di hamming. – delnan
btw, la clausola if deve essere modificata a while (num> 0) – Pompair
@Pompair: 'while (num)' è uguale a 'while (num! = 0)', quindi è corretto. –