2009-09-23 3 views

Répondre

-2

vous pouvez le faire en comptant le nombre de décalages vers la droite jusqu'à ce que le résultat non signé est nul

-1
if (i==0) return 1; 
else if (i==1) return 2; 
else if (i==2 || i==3) return 4; 
else if (i==4 || i==5 || i==6 || i==7) return 8; 
else if (...) 
+0

oh, voulez-vous dire que vous avez besoin d'un bon moyen? – mob

6
i>1 ? Integer.highestOneBit(i-1)<<1 : 1 

souffre évidemment de débordement d'entier (il n'y a pas une solution strictement correcte int pour environ la moitié de positif int s).

Avertissement: Non testé ou compilé.

+0

Pourquoi ne pas utiliser Long.highestOneBit? – Yishai

+0

Eh bien, vous pourriez le faire, mais si vous avez commencé avec un 'int', vous voulez probablement un résultat' int' de toute façon. Aussi, vous ne pouvez pas faire cela pour 'long'. Des entiers de précision arbitraires ftw! –

0
int nextPow2(int n) { 
    if (n <= 1) return n; 
    double d = n - 1; 
    return 1 << ((Double.doubleToRawLongBits(d) >> 52) - 1022); 
} 

La solution la plus rapide que j'ai trouvée sur le bureau.

Questions connexes