Quelle est la meilleure solution pour obtenir le logarithme de base 2 d'un nombre que je sais est une puissance de deux (2^k
). (. Bien sûr, je sais que la valeur 2^k
pas k
lui-même)Comment obtenir lg2 d'un nombre qui est 2^k
Une façon dont je pensais de faire est en soustrayant 1, puis faire un Bitcount:
lg2(n) = bitcount(n - 1) = k, iff k is an integer
0b10000 - 1 = 0b01111, bitcount(0b01111) = 4
Mais est-il un moyen plus rapide de le faire (sans mise en cache)? Aussi quelque chose qui n'implique pas le bitcount à peu près aussi vite serait bon à savoir?
Une des applications est ce:
suppose you have bitmask
0b0110111000
and value
0b0101010101
and you are interested of
(value & bitmask) >> number of zeros in front of bitmask
(0b0101010101 & 0b0110111000) >> 3 = 0b100010
this can be done with
using bitcount
value & bitmask >> bitcount((bitmask - 1) xor bitmask) - 1
or using lg2
value & bitmask >> lg2(((bitmask - 1) xor bitmask) + 1) - 2
Pour qu'il soit plus rapide que bitcount sans mise en cache, il devrait être plus rapide que O(lg(k))
où k
est le nombre de bits de stockage.
probablement le moyen le plus rapide est ...) – Egon