Newsgroup: it.comp.lang.c
Titolo: potenza di 2

salve a tutti, come faccio a controllare se una certa variabile intera
(DIM, per esempio) 
è una potenza di 2 ?
Grazie

 
 > le potenze di due sono tutte pari
Quindi 6 e` una potenza di 2? :-)

 Quindi 6 e` una potenza di 2? :-)
Uhm, post molto poco felice.
Intendevo dire: sapere che le potenze di due sono necessariamente pari 
non mi basta per controllare che un numero sia effettivamente una 
potenza di due.

 è una potenza di 2 ?
Se la variabile e` unsigned puoi procedere per shit, ricordandoti che la
moltiplicazione per 2 (e quindi l'elevamento a potenza) equivale ad uno
shift a sx. 2^n sara` rappresentato come (1 << n).
Quindi ti basta shiftare a dx fino a trovare il primo '1'. Se a questo
punto il numero che ti rimane e` diverso da '1' allora non e` una
potenza del 2:
unsigned int tmp;
tmp = num;
do {
        if (num & 0x1)
                /* Trovato il primo uno */
                if (num != 1)
                        return false;
                else
                        return true;
        tmp >>= 1;
} while(tmp);
 
La condizione sul while la tengo per sicurezza, nel caso il numero in
questione sia zero.
Luca
-- 
Home: 
http://kronoz.cjb.net
La mia opinione puo` essere cambiata, ma non il fatto che ho ragione.

Dilettante wrote:

...
double i = DIM;
while ( i > 2 )
	i /= 2.0;
if ( i == 2.0 )
	trovato;
...
Ciao.
-- 
                Roberto Nunnari -software engineer-
                     mailto:
ro...@nunnisoft.ch
   Residenza Boschetto 12           tel/fax: 
+41-91-6046511
   6935 Bosco Luganese        """    mobile: 
+41-76-3208561
   Switzerland               (o o)
========================oOO==(_)==OOo========================

     trovato;
Usare un == tra valori double/float e' sempre molto pericoloso, causa 
errori di arrotondamento. Per di piu', esiste una soluzione con interi 
(usando sia / che %), che quindi molto probabilmente e' pure piu' veloce.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

Dilettante wrote:
 > salve a tutti, come faccio a controllare se una certa variabile intera
 > (DIM, per esempio)
 > è una potenza di 2 ?
 >
 > Grazie
 >
Non c'e' bisogno di cicli vari. Basta sfruttare
la rappresentazione binaria.
La seguente funzione dovrebbe fare al caso tuo:
int Test2Pow(unsigned int x)
{
    return  x && !(x&(x-1));
}
e poi:
if (Test2Pow(DIM)) {...}
(naturalmente non c'e' bisogno che il codice lo
metti dentro una funzione, puoi schiaffarlo
direttamente dove ti serve, tipo:
if (DIM && !( DIM & (DIM-1))) {....}
)
se poi sai a priori che x e' diversa da 0 (che NON e'
una potenza di 2) basta fare
return  !(x&(x-1));
Se non capisci cosa sto facendo, studia gli operatori &, &&, e !.
ciao,
g.

hai ragione
si puo 'shiftare' pero

 Luca
Ciao
Matic

 Se la variabile e` unsigned puoi procedere per shit,
Puoi procedere per... "merda"?!
Mah
questi programmatori


hehehe.. kronos intendeva.. shift


 Puoi procedere per... "merda"?!
LOL!
Si, si... Assolutamente si...
Ma solo in quel caso pero'. :))
Eh Kronos...
Non conta nulla che tu ne abbia azzeccate cinquemila.
Se ne sbagli una di un pelino... Sei finito! ;)
Marcello