Sono stato a ripulire la manipolazione bit e mi sono imbattuto in questo. Potrebbe non essere utile al poster originale ora (3 anni dopo), ma risponderò comunque per migliorare la qualità per gli altri spettatori.
Cosa significa per n & (n-1)
uguale a zero?
Dobbiamo assicurarci che lo sappiamo, poiché questo è l'unico modo per interrompere il ciclo (n != 0
). Diciamo n=8
. La rappresentazione bit per quello sarebbe 00001000
. La rappresentazione bit per n-1
(o 7) sarebbe 00000111
. L'operatore &
restituisce i bit impostati in entrambi gli argomenti. Poiché 00001000
e 00000111
non hanno bit simili, il risultato sarebbe 00000000
(o zero). Potresti aver capito che il numero 8 non è stato scelto a caso. Era un esempio in cui n
è la potenza di 2. Tutte le potenze di 2 (2,4,8,16, ecc.) Avranno lo stesso risultato.
Cosa succede quando si passa qualcosa che non è un esponente di 2? Ad esempio, quando n=6
, la rappresentazione bit è 00000110
e n-1=5
o 00000101
.Il &
viene applicata a questi 2 argomenti e hanno solo un singolo bit in comune che è 4. Ora, n=4
che non è zero così si incrementa c
e cercare lo stesso processo con n=4
. Come abbiamo visto sopra, 4 è un esponente di 2 quindi interromperà il ciclo nel prossimo confronto. Si sta tagliando fuori il bit più a destra fino a quando n
è pari ad una potenza di 2.
Che cosa è c
?
Si incrementando solo da uno ogni ciclo e inizia da 0. c
è il numero di bit tagliate prima che il numero è uguale a una potenza di 2.
fonte
2016-04-01 13:30:41
Pensare a lungo sottrazione e "prestito". –
Cancella il bit più a destra perché il bit più a destra di 'n - 1' non è mai uguale a' n'. – 0x499602D2
[Il trucco del conteggio dei bit di Kernighan!] (Http: //cs.stanford.edu/~ seander/bithacks.html # CountBitsSetKernighan) – Ternary