Le calcul de l'étage de log_2(x) en utilisant seulement les opérateurs sur les bits en C

Pour les devoirs, à l'aide de C, je suis censé faire un programme qui trouve le logarithme de base 2 d'un nombre supérieur à 0, en utilisant seulement les opérateurs ! ~ & ^ | + << >>. Je sais que je suis censé décalage à droite d'un certain nombre de fois, mais je ne sais pas comment faire pour garder une trace du nombre de fois sans avoir toutes les boucles ou ifs. J'ai été coincé sur cette question de jours, de sorte que toute aide est très appréciée.

int ilog2(int x) {

    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >> 16);

}

C'est ce que j'ai jusqu'à présent. Je passe le bit le plus significatif à la fin.

Encore un de ces "bit à bit" questions qui permet +...
Il y a 10 sortes de gens dans ce monde...
aggregate.org/MAGIC/#Log2%20of%20an%20Integer
Le lien ci-dessus vous donnera étage(log2(x)), où x est un entier de 32 bits. Rien de trop de fantaisie à propos de la réponse mais, déplacer simplement par 1, par 2, par 4, par 8 et par 16, et en additionnant les résultats.
Puis-je obtenir des points pour que?

OriginalL'auteur Brett Cox | 2014-01-29