如何获取已知为2的幂次方(2^k
)的数字的底数为2的对数?(当然,我只知道值为2^k
而不知道k
本身。)
我想到的一种方法是先减去1,然后进行位计数:
lg2(n) = bitcount( n - 1 ) = k, iff k is an integer
0b10000 - 1 = 0b01111, bitcount(0b01111) = 4
但是有没有更快的方法可以做到这一点(不使用缓存)?同时,如果有一些与位计数速度相近但不涉及位计数的方法也很好知道。
其中一个应用程序是:
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
如果不缓存,它需要比位计数(bitcount)更快,时间复杂度应该在O(lg(k))
以内,其中k
是存储位的数量。