2011-01-13 19 views

risposta

34

Sta capendo se n è 0 o una potenza esatta di due.

Funziona perché una potenza binaria di due è nella forma 1000...000 e sottraendone una si ottiene 111...111. Poi, quando tu e quelli insieme, si ottiene lo zero, come ad esempio con:

1000 0000 0000 0000 
& 111 1111 1111 1111 
    ==== ==== ==== ==== 
= 0000 0000 0000 0000 

Qualsiasi valore di ingresso non-potere-di-due (diverso da zero) sarà non darà zero quando si esegue questa operazione .

Per esempio, proviamo tutte le combinazioni 4 bit:

 <----- binary ----> 
n  n n-1 n&(n-1) 
-- ---- ---- ------- 
0 0000 0111 0000 * 
1 0001 0000 0000 * 
2 0010 0001 0000 * 
3 0011 0010 0010 
4 0100 0011 0000 * 
5 0101 0100 0100 
6 0110 0101 0100 
7 0111 0110 0110 
8 1000 0111 0000 * 
9 1001 1000 1000 
10 1010 1001 1000 
11 1011 1010 1010 
12 1100 1011 1000 
13 1101 1100 1100 
14 1110 1101 1100 
15 1111 1110 1110 

Si può vedere che solo 0 e le potenze di due (1, 2, 4 e 8) risultato in un po 'modello 0000/false, tutti gli altri sono non-zero o true.

4

Restituisce 0 se n è una potenza di 2 (NB: funziona solo per n > 0). Quindi puoi provare per una potenza di 2 come questa:

bool isPowerOfTwo(int n) 
{ 
    return (n > 0) && ((n & (n - 1)) == 0); 
} 
+0

Il tuo codice qui non funziona, fyi. '&' ha precedenza più bassa di '=='. http://ideone.com/Ixct2I – chacham15

1

È un'operazione bit a bit tra un numero e il suo numero precedente. L'unico modo questa espressione potrebbe mai essere falso è se n è una potenza di 2, così essenzialmente si sta verificando se non è una potenza di 2.

+0

ITYM * potenza * di 2? –

+0

Oops. Ecco cosa intendevo. – Neil

Problemi correlati